[更新]:当前redis将每个已发布的消息发送到整个集群中的每个节点:
/* -----------------------------------------------------------------------------
* CLUSTER Pub/Sub support
*
* For now we do very little, just propagating PUBLISH messages across the whole
* cluster. In the future we'll try to get smarter and avoiding propagating those
* messages to hosts without receives for a given channel.
* -------------------------------------------------------------------------- */
void clusterPropagatePublish(robj *channel, robj *message) {
clusterSendPublish(NULL, channel, message);
}
这是问题的原始文本,这是不正确的:
据我所知,我需要:
- 给定一个通道,找到拥有该哈希槽的节点。
- 订阅该节点以及群集:插槽以检测迁移。
- 在插槽迁移时,订阅新节点上的通道并保持旧连接打开。
- 将消息从旧连接转发到应用程序,直到它关闭并记住这些消息。
- 迁移完成并关闭旧连接后,转发来自新连接的消息,从第一个连接中修剪记住的消息。
golang redis客户端库中的任何一个都可以这样做吗?我看了很多,感觉我需要自己编写这个逻辑,不断轮询
CLUSTER SLOTS
或者听一下该信息的pubsub,以了解分片增加或减少的时间,并将我现有的pubsub脚本从一个服务器移动到另一个服务器。即有很多golang库,即使分片数量发生变化,也可以使用集群处理普通的GET密钥。但是pubsub和cluster是另一回事吗?
Redis集群中的PubSub通道在所有节点之间共享 - 消息通过内部总线传递,因此您不需要特殊的客户端和/或逻辑。
在Redis群集中,客户端可以订阅每个节点,也可以发布到每个其他节点。群集将确保根据需要转发已发布的消息。