0

我正在尝试使用 NServiceBus 实现发布订阅通道。根据企业集成模式一书,推送订阅频道被描述为:

Publish-Subscribe Channel 的工作原理如下:它有一个输入通道,该通道分为多个输出通道,每个订阅者一个。当事件发布到通道中时,发布-订阅通道将消息的副本传递到每个输出通道。通道的每个输出端只有一个订阅者,允许订阅者只消费一次消息。这样,每个订阅者只收到一次消息,并且消费的副本从他们的频道中消失。

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

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

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

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

[2016 年 2 月 2 日更新]

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

4

2 回答 2

1

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

场景

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

在此处输入图像描述

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

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

在此处输入图像描述

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

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

在此处输入图像描述

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

概括

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

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

于 2016-01-21T18:36:35.400 回答
0

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

当使用持久性持久性时,如 SQL Server 或类似的东西,订阅将被存储和保存。因此,在重新启动服务后,立即知道所有订阅者。使用内存存储,每次重新启动发布者时订阅都会丢失。因此,在所有订阅都成为进程之前需要等待更长的时间。

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

我自己写了一个教程,可能也会有所帮助。

于 2016-01-21T07:58:46.063 回答