Redis Pub/Sub上的竞争消费者是否受到支持?

jor*_*dan 28 message-queue publish-subscribe redis

我有2项服务.他们俩都需要订阅同一个频道.

这两项服务是负载平衡的.每个服务都在多个服务器上运行

那么我怎样才能确定每个服务的1个实例只消耗该通道的消息.

这是Redis支持的吗?

谢谢

Tom*_*son 30

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

  • 发送消息时只需运行两个命令 - 一个RPUSH和一个PUBLISH.当客户端使用SUBSCRIBE接收消息时,让它在列表上调用LPOP.如果LPOP没有返回任何其他工作者已经处理过该消息的内容,那么可以忽略它. (4认同)
  • 如果您不想更改发布者,则需要在订阅者上标记消息状态 - 类似于`SETNX service1receivedmessage1 1` 结合 EXPIRE 应该可以工作 - 如果服务的另一个实例已经设置了旗帜。 (4认同)
  • 如果要在Redis上使用生产者/消费者模式,则根本不需要使用pub/sub.只需让生产者LPUSH工作到一个列表中,并从列表中获得您的消费者BRPOP(或者如果您希望消费者为不同类型的请求服务多个不同的队列,则为多个列表).BRPOP将有效阻止,直到一个事件进入,每个事件只会去和唤醒一个消费者.可以将其视为类似于select()系统调用的高级抽象.(BRPOP也采用可选的超时值,就像select()一样). (3认同)

dun*_*289 29

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

  • 我很确定这是正确的做法. (3认同)
  • `while(true){BLPOP}`非常简单,谢谢! (2认同)

dlo*_*lez 5

您需要将 Redis Streams 与 XREADGROUP 一起使用,这是 Redis 的一项新功能。

https://redis.io/topics/streams-intro