我应该对带有 Redis 的 Pub 和 Sub 使用单独的连接吗?
Posted
技术标签:
【中文标题】我应该对带有 Redis 的 Pub 和 Sub 使用单独的连接吗?【英文标题】:Should I use separate connections for Pub and Sub with Redis? 【发布时间】:2014-05-05 06:47:32 【问题描述】:我注意到 Socket.io 使用两个独立的 Pub 和 Sub 连接到 Redis 服务器。它可以提高性能吗?还是仅仅是朝着更有组织的事件处理程序和代码迈进?两个单独的连接和一个单独的连接用于发布和订阅的优缺点是什么。
P.S. 系统正在推送大约与其接收的相同数量的消息。它将更新推送到层次结构中位于同一级别的服务器,因此没有主服务器推送所有更新,也没有从服务器使用消息。一台服务器大约有 4-8 个订阅,它会将消息发送回这些服务器。
P.S.S. 这更像是一个专门构建的作业队列的作业吗?我看Redis的原因。是我已经在其中保留了一些共享对象,所有服务器都在使用这些共享对象。消息队列值得添加另一个网络连接吗?
【问题讨论】:
【参考方案1】:您必须为 pub 和 sub 使用两个连接。订阅者连接不能发出除subscribe
、psubscribe
、unsubscribe
、punsubscribe
以外的任何命令(尽管@Antirez 暗示将来会提供订阅者安全的ping
)。如果你尝试做其他事情,redis 会告诉你:
-ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context
(请注意,您无法使用 redis-cli 对此进行测试,因为它对协议的理解足以防止您在订阅后发出命令 - 但任何其他基本套接字工具都应该可以正常工作)
这是因为订阅者连接的工作方式非常不同 - 而不是基于请求/响应工作,传入消息现在可以随时进来,不请自来。
publish
是常规请求/响应命令,因此必须在常规连接上发送,而不是在订阅者连接上发送。
【讨论】:
谢谢你。我完全不知道为什么会出现这个错误。以上是关于我应该对带有 Redis 的 Pub 和 Sub 使用单独的连接吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在C ++中使用带有hiredis的Pub / sub?
在Redis pub / sub和Akka Streams中使用SSE的最简单方法是什么?
我在集群 node.js/socket.io/redis pub/sub 应用程序中收到重复消息