.net 实现持久的发布/订阅?

.net 实现持久的发布/订阅?,.net,wcf,messaging,publish-subscribe,.net,Wcf,Messaging,Publish Subscribe,假设我有一个出版商和多个听众。当发布者发送消息时,所有侦听器都必须接收该消息。如果其中一位听众情绪低落,他应该在重新站起来后立即收到信息 我如何实现这一点 我在考虑使用队列: 每个侦听器创建自己的队列,并向发布者发送一条包含其队列位置的subscrtiption消息。发布者将该位置保存到文件或数据库中,并开始将其消息发送到该队列 因此,这将是时间表: Publisher已启动。还没有听众 发布者发送消息1 发布者发送消息2 发布者发送消息3 侦听器1启动并订阅publisher 发布者发送消息4

假设我有一个出版商和多个听众。当发布者发送消息时,所有侦听器都必须接收该消息。如果其中一位听众情绪低落,他应该在重新站起来后立即收到信息

我如何实现这一点

我在考虑使用队列: 每个侦听器创建自己的队列,并向发布者发送一条包含其队列位置的subscrtiption消息。发布者将该位置保存到文件或数据库中,并开始将其消息发送到该队列

因此,这将是时间表:

Publisher已启动。还没有听众

发布者发送消息1

发布者发送消息2

发布者发送消息3

侦听器1启动并订阅publisher

发布者发送消息4

侦听器1接收消息4

侦听器2启动并订阅发布服务器

发布者发送消息5

侦听器1接收消息5

侦听器2接收消息5

监听器2

发布者发送消息6

侦听器1接收消息6

发布者发送消息7

侦听器1接收消息7

侦听器2返回,无需再次订阅

侦听器2接收消息6

侦听器2接收消息7

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

您不应该为每个订阅者设置单独的队列,但您至少需要两个队列。可伸缩性的首要关键是确保当发布者发送其初始消息时,您不会试图在该时间点向所有订阅者“扇出”。相反,您将它放在接收的队列中,并立即返回,让发布者知道它成功了。从那里,您就有了由主接收队列馈送的工作人员,他们的职责是将消息“扇出”到各个订阅者。它通过查明这些订阅者是谁,生成N条消息,其中包含来自发布者的原始消息以及每个侦听器的地址/绑定信息,并将这些消息发送到传递队列。最后,还有一些工作人员负责从传递队列中提取消息,并尝试使用地址/绑定信息进行传递


处理传递错误的方法可以是将消息移动到重试队列,在重试队列中,消息将被休眠X个时间,然后再次在传递队列中被替换。然后你当然要处理有毒消息,你已经重试了5次,而监听器每次都会抛出错误。需要将这些队列移动到某种死信队列以进行错误报告。

您不需要每个订阅者都有一个单独的队列,但至少需要两个队列。可伸缩性的首要关键是确保当发布者发送其初始消息时,您不会试图在该时间点向所有订阅者“扇出”。相反,您将它放在接收的队列中,并立即返回,让发布者知道它成功了。从那里,您就有了由主接收队列馈送的工作人员,他们的职责是将消息“扇出”到各个订阅者。它通过查明这些订阅者是谁,生成N条消息,其中包含来自发布者的原始消息以及每个侦听器的地址/绑定信息,并将这些消息发送到传递队列。最后,还有一些工作人员负责从传递队列中提取消息,并尝试使用地址/绑定信息进行传递


处理传递错误的方法可以是将消息移动到重试队列,在重试队列中,消息将被休眠X个时间,然后再次在传递队列中被替换。然后你当然要处理有毒消息,你已经重试了5次,而监听器每次都会抛出错误。这些将需要移动到某种死信队列中进行错误报告。

你是对的,这正是NServiceBus(例如)在MSMQ上实现pub-sub的方式。请在此处阅读更多信息:

你是对的,这正是NServiceBus(例如)在MSMQ之上实现pub-sub的方式。请在此处阅读更多信息:

看起来不错。我将尝试使用NServicebus运行一些示例。看起来不错。我会尝试用NServicebus运行一些样本,我明白了。发布者必须只向一个队列发送消息,而不必通过所有订阅者为每个队列发送消息。由一名或多名工人进行教学。因为出版商对所有订阅者的教学速度太慢,有成百上千的听众。这是正确的。让出版商尽可能快地传递和坚持它的信息,并在生活中继续前进。然后,对订阅者的交付是解耦的、延迟的、异步的。。。一切都好。:)我明白了。发布者必须只向一个队列发送消息,而不必通过所有订阅者为每个队列发送消息。由一名或多名工人进行教学。因为出版商对所有订阅者的教学速度太慢,有成百上千的听众。这是正确的。让出版商尽可能快地传递和坚持它的信息,并在生活中继续前进。然后,对订阅者的交付是解耦的、延迟的、异步的。。。一切都好。:)