我有2个服务,它们都需要订阅同一个频道。
这2个服务是负载均衡的。每个服务运行在多个服务器上。
那么,我如何确保每个服务的只有1个实例消费该频道的消息。
Redis是否支持这一点?
谢谢
我有2个服务,它们都需要订阅同一个频道。
这2个服务是负载均衡的。每个服务运行在多个服务器上。
那么,我如何确保每个服务的只有1个实例消费该频道的消息。
Redis是否支持这一点?
谢谢
发布/订阅模式不能按那种方式工作-消息会发送到所有已连接的订阅客户端。但是,您可以将其设置为通知列表更新的频道。这样,所有客户端都会收到消息,但只有一个客户端可以使用LPOP从列表中获取该项。
另一种方法是使用您的服务实例中的B*POP
。如果有很多客户端针对列表运行B*POP
,每当您对其进行LPUSH
操作时,其中一个客户端将获取数据,但仅限于一个。
我通过编写由请求ID(UUID)键入的值来临时实现了这一点。请求者在发布之前使用set写入该值,消费者将尝试删除此项,只有成功删除该项的消费者才被视为将处理请求的消费者。我还没有在大规模上测试过它,所以可能它不能满足我想要的规模。
SETNX service1receivedmessage1 1
结合EXPIRE使用应该可以解决问题 - 如果服务的另一个实例已经设置了标志,SETNX将返回0。 - Tom Clarkson