2011-05-27 62 views
0

比方说,我有一个发布者和多个听众。发布者发送消息时,必须由所有听众接收。如果其中一个听众倒闭了,他应该在他再次回来的时候收到留言。实现耐用的pub/sub?

我该如何执行此操作?

我正在考虑使用队列: 每个侦听器都使用它自己的队列,并使用队列的位置向发布者发送子邮件消息。发布者将位置保存到文件或数据库,并开始将其消息发送到该队列。

所以,这将是时间表:

出版商开始。还没有听众。

出版者发送消息1.

出版者发送消息2

出版者发送消息3

监听器1开始,并与发布者所预订。

出版者发送消息4

监听器1接收消息4

监听器2开始并与发布者所预订。

出版者发送消息5

监听器1接收消息5

监听器2接收消息5

监听器2 chrashes。

出版者发送消息6

监听器1接收消息6

出版者发送消息7.

监听器1接收消息7.

监听器2恢复时,没有必要再次订阅。

监听器2接收消息6

监听器2接收消息7.

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

回答

3

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

处理传递错误的方式可能是将邮件移动到重试队列中,邮件在传递队列中被重新替换之前将被放置X个时间。那么你当然必须处理重试5次的有害信息,而听众每次都会给你带来错误。那些需要移动到某种错误报告的死信队列中。

+0

我明白了。发布者必须仅向一个队列发送消息,并且不必为每个订阅者都发送消息。这些工作将由一名或多名工作人员完成。因为发行商对所有用户的每个订阅者的速度太慢,数百或数千听众。 – Thomas 2011-05-27 20:24:53

+0

这是正确的。让发布者尽快发布消息并坚持下去,并在生活中继续前进。然后交付给用户是解耦的,延期的,异步的......都很好。 :) – 2011-05-27 21:00:32

0

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

+0

看起来不错。我会尝试使用NServicebus运行一些示例。 – Thomas 2011-05-27 20:21:53