【问题标题】:Implementing a A Publish-Subscribe Channel using NServiceBus使用 NServiceBus 实现一个发布-订阅通道
【发布时间】:2016-04-26 12:17:28
【问题描述】:

我正在尝试使用 NServiceBus 实现发布-订阅通道。根据 Enterprise Integration Patterns 一书,推送订阅频道被描述为:

发布-订阅通道的工作方式如下:它有一个输入通道 分成多个输出通道,每个订阅者一个。 当一个事件被发布到频道中时,Publish-Subscribe 通道将消息的副本传递到每个输出通道。 通道的每个输出端只有一个订阅者,即 只允许消费一次消息。这样,每个订阅者 只收到一次消息,消费的副本从他们的 渠道。

霍普,格雷戈尔;伍尔夫,鲍比 (2012-03-09)。企业整合 模式:设计、构建和部署消息传递解决方案 (Addison-Wesley 签名系列(Fowler))(Kindle 位置 2880-2883)。培生教育。 Kindle 版。”

有一个包含发布者和订阅者的示例:http://docs.particular.net/samples/step-by-step/。我已经为版本 5 构建了示例解决方案。然后我在不同的命令行窗口中运行了多个订阅者,以查看系统的行为。

即使有多个订阅者,也只有一个订阅者会收到发布的事件。发布多个事件最多会导致一个订阅者处理该事件。

我找不到任何有关如何将 NServiceBus 配置为引用文本中定义的发布-订阅通道的信息。有谁知道如何做到这一点?不支持吗?

[2016 年 2 月 2 日更新]

复制订阅者后,我没有重命名端点。这给了我想要的行为。

【问题讨论】:

  • 您可以为每个端点发布您的代码和单播总线配置吗?
  • 代码在这里:docs.particular.net/samples/step-by-step/step-by-step.zip。我创建了另一个具有完全相同行为的基于 RabbitMQ 的版本。他们的官方样本具有相同的行为,所以我认为这可能是设计使然。
  • 你应该能够有几个不同的类来实现 IHandleMessage 并且他们都应该得到它。这就是它一直以来的工作方式。这不需要额外的配置。
  • 我发现我做错了什么:复制订阅者后我没有重命名端点。我将更新我的问题以反映这一点。

标签: c# nservicebus publish-subscribe message-passing eip


【解决方案1】:

订阅者需要先启动才能发送他们有兴趣订阅事件的消息。然后发布者需要启动,有时间处理订阅消息。当所有订阅都存储后,您才能发布消息。如果您在所有订阅实际存储之前发布消息,NServiceBus 只会将消息发送给它已经知道的订阅者。一秒钟后,所有订阅者可能都知道了,但到那时您已经发布了您的消息。

当使用持久性持久性时,如 SQL Server 或类似的东西,订阅将被存储和保留。因此,在重新启动服务后,立即知道所有订阅者。使用内存存储,每次重新启动发布者时订阅都会丢失。因此,需要等待一段时间,直到所有订阅都处理完毕。

这也可能是一个问题,不是每个订阅者都在发送消息,因为您可能弄错了配置。

我自己有written a tutorial,这也可能会有所帮助。

【讨论】:

    【解决方案2】:

    如果您正在运行同一订阅者的多个实例,那么您所描述的是预期的功能。

    场景

    1 个发布者,1 个逻辑订阅者

    某个处理器发布了一个事件,并且一个电子邮件处理程序订阅了该事件。当事件被电子邮件处理程序消费时,电子邮件处理程序将发送一封电子邮件。在这种情况下,只有一个逻辑订阅者,即电子邮件处理程序。因此,只会发送一份事件副本。

    1 个发布者,2 个逻辑订阅者

    在下一个场景中,有两个逻辑订阅者:发票处理程序和电子邮件处理程序。当处理器发布一个事件时,会发送该事件的两个副本。一个给发票处理程序,一个给电子邮件处理程序。

    1 个发布者,1 个逻辑订阅者的 2 个实例

    在这种情况下,即使有两个服务订阅了该事件,也只有一个逻辑订阅者。在这种情况下,仅发送一份事件副本,并且只有一个电子邮件处理程序将处理该事件。如果两个电子邮件处理程序都处理了该事件,那么您将为订阅者的 N 个实例完成 N 个操作。换句话说,将发送两封电子邮件,而不仅仅是一封。最有可能的是,这种情况需要两个电子邮件处理程序,因为单个处理程序无法跟上处理器的负载,或者需要冗余。

    总结

    如果您只是启动同一订阅者的多个实例,您仍将只有一个订阅者处理该事件。这是设计使然。否则,每个额外的流程都会重复该工作。

    如果您想查看两个逻辑订阅者,请在该解决方案中创建一个具有不同名称的新项目,并订阅相同的事件(在代码中或使用配置文件)。然后启动发布者和每个订阅者的一个实例。发布者发布事件后,您将看到两个订阅者都在处理该事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多