【问题标题】:NServiceBus pub/sub - where have my messages gone?NServiceBus pub/sub - 我的消息去哪儿了?
【发布时间】:2010-12-16 14:55:54
【问题描述】:

好吧,我已经做了一段时间的 NServiceBus 项目,一旦我为 PubSub 工作了它,我就将剩下的时间花在实际的工作流逻辑上。但是,我可以看到一个我想解决的严重问题(或者更确切地说是学习如何正确处理)。

据我所知,发布者将消息发布到任何订阅者的存储队列。伟大的。但是当订阅者没有运行时会发生什么(我已经阅读了其他关于此的帖子,他们似乎没有问同样的问题)。

场景 - 当没有订阅者正在运行时,我让发布者发布消息(附加/请求的消息将转发给他们).. 然后我发现.. 消息“消失”了,只是根本不存在!它去哪儿了?发布者是否说“嘿,没有人订阅这个,所以我不会打扰发布它?”,它不应该这样做并且至少需要一个订阅者吗?

任何人都可以对此有所了解吗? (nservicenewbie)

【问题讨论】:

  • 所以从我目前的理解来看——没有订阅者被“附加”不一定是一个错误。不过,在我的现实生活场景中,您需要启动发布者(正在读取要发布的消息),然后是订阅者。在订阅者开始之前,发布者可能已经发布了一堆消息!所以..这些基本上都丢失了,并且工作流操作“陷入”了一些“进行中”的状态。我可以修改 nServiceBus 的 Publish 方法.. 但我真的不想..

标签: nservicebus publish-subscribe


【解决方案1】:

您应该发布一个已经发生的事件 - 一个事实陈述,其他处理程序可能感兴趣也可能不感兴趣。零订阅者是完全有效的!如果不是这种情况,那么也许您应该发送()命令而不是发布()事件。

如果您使用的是持久订阅存储,请启动订阅者一次,它将始终被订阅。如果订阅者处于离线状态,它的消息将堆积在其输入队列中,等待订阅者重新在线时进行处理。

如果您只是使用 NServiceBus 进行测试,则 NServiceBus.Host.exe 正在 Lite 配置文件中运行,该配置文件使用内存中(非持久)订阅存储,这将产生您所看到的内容。

【讨论】:

  • 感谢 David - 我如何判断主机 exe 是否在 Lite 配置文件中运行?
  • 关于发送方法的观点 - 是的,听起来我应该使用发送。但是,如果您说在非 Lite 模式下,如果订阅者(本地)离线,这些发布的消息只会在队列中建立,那么这种方法应该没问题
  • 配置文件由命令行参数选择。如果您不提供,则 Lite 是默认设置。见nservicebus.com/Profiles.aspx
【解决方案2】:

啊哈!好吧,虽然没有消息类型的订阅者并不总是错误,但有一种方法可以处理它。

在您的发布者中只需修改:

IBus Bus

要使用(您将需要 NServiceBus.Core.dll 和 NS NServiceBus.Unicast):

IUnicastBus Bus

然后您可以将处理程序附加到:

Bus.NoSubscribersForMessage += .......

然后可以将消息放入错误队列中……或者永远重试……或者发布其他内容等等……等等……你想要什么。从而确保在您的特定系统(从业务角度)需要结果时不会丢失任何东西

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2014-03-15
    相关资源
    最近更新 更多