如何在 pubsub 中删除订阅者集群的重复接收

  • 本文关键字:pubsub 删除 redis rabbitmq
  • 更新时间 :
  • 英文 :


我在考虑如何在pubsub中删除订阅者集群的重复性,例如:有一个名为电子邮件的服务,它应该在用户注册后发送欢迎电子邮件。通过使用发布/订阅,电子邮件服务将侦听一个名为"signedUp"的事件,该事件将在用户每次注册时触发。但是,如果我有 2 个电子邮件服务需要平衡怎么办?没有任何特别的努力,我想会发出两封欢迎电子邮件。那么如何解决这个问题呢?

为了简单起见,我更喜欢 redis 作为 pubsub 服务器,或者如果 redis 不起作用,则更喜欢 rabbitmq。

我认为在

redis 中不可能做到这一点。但是在 rabbitmq 中,它可以,让我在下面解释一下:

Rabbitmq有一个单独的东西,叫做"交换",来自队列。所以服务器发布消息到交换,客户端可以创建队列绑定到交换。因此,来自一个服务的实例可以创建相同的队列以与 exchange 绑定,通过这样做,交换会将消息传递到队列一次,并且仅由一个实例处理一次。

账户服务:

channel.assertExchange(‘signedUp’, 'fanout')
channel.publish(ex, '', new Buffer(message)

电子邮件服务:

let queue = channmel.assertQueue(‘email’);
channel.bindQueue(queue, 'signedUp'); // bind this queue to exchange
ch.consume(queue, logMessage)
通过在电子邮件服务中

给定队列名称,无论启动了多少个电子邮件服务,已发布的消息(在本例中已注册)都将由一个且仅一个电子邮件服务处理。

最新更新