实施持久的pub / sub?

时间:2011-05-27 13:37:25

标签: .net wcf messaging publish-subscribe

假设我有一个发布者和多个听众。当发布者发送消息时,必须由所有侦听器接收。如果其中一个听众失败了,他应该在他再次回来的时候得到这个消息。

我该如何实现?

我在考虑使用队列: 每个侦听器都创建自己的队列,并向发布者发送一个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。

底线是我需要每个侦听器一个队列,以及一个队列或通道来发送和接收“开始侦听”和“停止侦听”的消息。 我在思考正确的方向,还是我完全错了?

2 个答案:

答案 0 :(得分:3)

每个订阅者不需要单独的队列,但您至少需要两个队列。可扩展性的最初关键是确保当发布者提供初始消息时,您不要试图在该时间点向所有订阅者“扇出”。相反,你把它放在收到的队列上并立即返回让发布者知道它已成功。从那里你有工作人员由主接收队列供电,他们的责任是将信息“扇出”给各个用户。它通过确定这些订阅者是谁并使用每个侦听器的地址/绑定信息生成包含来自发布者的原始消息的N个消息并将其填充到传递队列中来实现此目的。最后,您有工作人员负责从交付队列中提取消息并尝试使用地址/绑定信息进行交付。

如何处理传递错误可以通过将邮件移动到重试队列,在重试队列中,邮件将在X时间内进入休眠状态,然后再次在传递队列中进行替换。然后你当然必须处理毒性消息,你已经重试了5次,而且听众每次都会抛出你的错误。这些将需要移动到某种死信队列以进行错误报告。

答案 1 :(得分:0)

你是对的,这正是NServiceBus(例如)在MSMQ之上实现pub-sub的方式。在此处阅读更多相关信息:http://docs.particular.net/samples/pubsub/