支持Redis Pub/Sub上的竞争消费者?

支持Redis Pub/Sub上的竞争消费者?,redis,message-queue,publish-subscribe,Redis,Message Queue,Publish Subscribe,我有两种服务。他们都需要订阅同一个频道 这两个服务是负载平衡的。每个服务在多台服务器上运行 因此,我如何确保每个服务只有一个实例使用该通道的消息呢 Redis支持这一点吗 谢谢Pubsub不是这样工作的-消息将发送到所有已连接的订阅客户端。但是,您可以对其进行设置,使通道成为列表更新的通知。这样,所有客户端都将获得消息,但只有一个客户端可以使用LPOP从列表中获取项目。另一种方法是从您的服务实例中使用B*POP。如果您有许多客户机针对列表运行B*POP,每当您LPUSH到它时,其中一个客户机将获

我有两种服务。他们都需要订阅同一个频道

这两个服务是负载平衡的。每个服务在多台服务器上运行

因此,我如何确保每个服务只有一个实例使用该通道的消息呢

Redis支持这一点吗


谢谢

Pubsub不是这样工作的-消息将发送到所有已连接的订阅客户端。但是,您可以对其进行设置,使通道成为列表更新的通知。这样,所有客户端都将获得消息,但只有一个客户端可以使用LPOP从列表中获取项目。

另一种方法是从您的服务实例中使用
B*POP
。如果您有许多客户机针对列表运行
B*POP
,每当您
LPUSH
到它时,其中一个客户机将获得数据,但只有一个

您需要在XREADGROUP中使用Redis Streams,这是Redis的一项新功能


这是个好主意。请您详细解释一下“设置频道,使其成为列表更新通知”的内容。Thanks在发送消息时必须运行两个命令—一个RPUSH和一个PUBLISH。当客户端使用SUBSCRIBE接收消息时,让它调用列表中的LPOP。如果LPOP没有返回任何其他工作人员已处理的消息,因此可以忽略它。如果不想更改发布者,您需要在订阅服务器上标记消息状态-类似于
SETNX service1receivedmessage1 1
与EXPIRE-should-work组合使用-如果服务的另一个实例已经设置了标记,SETNX将返回0。如果您想在Redis上使用生产者/消费者模式,则根本不需要使用发布/订阅。只需让producer(s)LPUSH工作到一个列表中,并让您的消费者从列表中BRPOP(例如,如果您希望消费者为不同类型的请求服务多个不同的队列,则可以使用多个列表)。BRPOP将有效地阻止,直到事件发生,并且每个事件将只进入并唤醒一个消费者。将其视为类似于select()系统调用的高级抽象。(BRPOP也有一个可选的超时值,就像select()一样)。我需要pub/sub,因为我的制作人不知道有多少消费者。这只是一个通知。任何对它感兴趣的人都可以订阅它。但我的情况更复杂。一个使用者可以在多个服务器上启动多个实例。我需要确保每个处理通知的消费者只有一个实例。