我在考虑如何删除pubsub中订阅者群集的重复项,例如: 有一项名为email的服务,应在用户注册后发送欢迎电子邮件。通过使用pub / sub,电子邮件服务将监听名为“signedUp”的事件,该事件将在每次用户注册时触发。但是,如果我有2个电子邮件服务来平衡怎么样?没有任何特别的努力,我认为会发送两封欢迎电子邮件。那么如何解决这个问题?
为了简单起见,我更喜欢redis作为pubsub服务器,或者如果redis没有用,我更喜欢rabbitmq。
答案 0 :(得分:0)
我不认为可以用redis做到这一点。但是在rabbitmq中,它可以,让我在下面解释一下:
Rabbitmq有一个叫做“交换”的单独的东西。从队列。因此服务器发布消息进行交换,客户端可以创建绑定到交换的队列。因此,来自一个服务的实例可以创建相同的队列以与交换绑定,通过执行该交换将消息传递到队列一次并且仅由一个实例处理一次。
帐户服务:
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)
通过在电子邮件服务中指定队列名称,无论启动了多少电子邮件服务,已发布的消息(本例中为signedUp)将由一个且仅一个电子邮件服务处理。