我在考虑如何在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)
通过在电子邮件服务中给定队列名称,无论启动了多少个电子邮件服务,已发布的消息(在本例中已注册)都将由一个且仅一个电子邮件服务处理。