假设我有一个发布者和多个听众。当发布者发送消息时,必须由所有侦听器接收。如果其中一个听众失败了,他应该在他再次回来的时候得到这个消息。
我该如何实现?
我在考虑使用队列: 每个侦听器都创建自己的队列,并向发布者发送一个subscrtiption消息及其队列的位置。发布者将位置保存到文件或数据库,并开始将其消息发送到该队列。
所以,这将是时间表:
发布商已启动。还没有听众。
Publisher发送消息1.
Publisher发送消息2.
Publisher发送消息3.
监听器1启动并订阅发布者。
Publisher发送消息4。
侦听器1收到消息4。
监听器2启动并订阅发布者。
Publisher发送消息5.
侦听器1收到消息5.
侦听器2收到消息5.
听众2发抖。
Publisher发送消息6。
侦听器1收到消息6。
Publisher发送消息7。
侦听器1收到消息7。
侦听器2重新启动,无需再次订阅。
侦听器2收到消息6。
侦听器2收到消息7。
底线是我需要每个侦听器一个队列,以及一个队列或通道来发送和接收“开始侦听”和“停止侦听”的消息。 我在思考正确的方向,还是我完全错了?
答案 0 :(得分:3)
每个订阅者不需要单独的队列,但您至少需要两个队列。可扩展性的最初关键是确保当发布者提供初始消息时,您不要试图在该时间点向所有订阅者“扇出”。相反,你把它放在收到的队列上并立即返回让发布者知道它已成功。从那里你有工作人员由主接收队列供电,他们的责任是将信息“扇出”给各个用户。它通过确定这些订阅者是谁并使用每个侦听器的地址/绑定信息生成包含来自发布者的原始消息的N个消息并将其填充到传递队列中来实现此目的。最后,您有工作人员负责从交付队列中提取消息并尝试使用地址/绑定信息进行交付。
如何处理传递错误可以通过将邮件移动到重试队列,在重试队列中,邮件将在X时间内进入休眠状态,然后再次在传递队列中进行替换。然后你当然必须处理毒性消息,你已经重试了5次,而且听众每次都会抛出你的错误。这些将需要移动到某种死信队列以进行错误报告。
答案 1 :(得分:0)
你是对的,这正是NServiceBus(例如)在MSMQ之上实现pub-sub的方式。在此处阅读更多相关信息:http://docs.particular.net/samples/pubsub/。