我正在尝试使用NServiceBus实现发布 - 订阅频道。根据企业集成模式一书,Pulish-Subscribe Channel被描述为:
发布 - 订阅频道的工作方式如下:它有一个输入频道 分成多个输出通道,每个用户一个。 当事件发布到频道时,发布 - 订阅 Channel将消息的副本传送到每个输出通道。 信道的每个输出端只有一个用户,即 允许仅使用一次消息。这样,每个订户 只获取一次消息,消费的副本从他们的消失中消失 信道。
Hohpe,Gregor;伍尔夫,博比(2012-03-09)。企业整合 模式:设计,构建和部署消息传递解决方案 (Addison-Wesley签名系列(福勒))(Kindle地点 2880年至2883年)。皮尔逊教育。 Kindle版。“
在http://docs.particular.net/samples/step-by-step/处有一个包含发布者和订阅者的示例。我已经为版本5构建了示例解决方案。然后我在不同的命令行窗口中运行了多个订阅者,以查看系统的行为。
即使有多个订阅者,也只有一个订阅者收到发布的事件。发布多个事件最多导致一个订阅者处理该事件。
我找不到有关如何将NServiceBus配置为引用文本中定义的发布 - 订阅频道的任何信息。有谁知道如何做到这一点?这不受支持吗?
[2016年2月2日更新]
复制订阅者后,我没有重命名我的端点。这给了我理想的行为。
答案 0 :(得分:2)
如果您正在运行同一订户的多个实例,那么您所描述的是预期的功能。
某些处理器发布了一个事件,并且电子邮件处理程序已订阅该事件。当电子邮件处理程序使用该事件时,电子邮件处理程序将发送电子邮件。在这种情况下,只有一个逻辑订阅者,即电子邮件处理程序。因此,只发送一个事件副本。
在下一个场景中,有两个逻辑订阅者:发票处理程序和电子邮件处理程序。当处理器发布事件时,会发送两个事件副本。一个是发票处理程序,一个是电子邮件处理程序。
在这种情况下,即使有两个订阅该事件的服务,也只有一个逻辑订阅者。在这种情况下,只发送一个事件副本,并且只有一个电子邮件处理程序将处理该事件。如果两个电子邮件处理程序都处理了该事件,那么您将为N个订户实例完成N个操作。换句话说,将发送两封电子邮件而不是一封。最有可能的是,这种情况需要两个电子邮件处理程序,因为单个处理程序无法跟上处理器的负载,或者需要冗余。
如果您只是启动同一订户的多个实例,您仍然只有一个订阅者处理该事件。这是设计的。否则,每个额外的过程都会重复工作。
如果要查看两个逻辑订阅者,请在该解决方案中创建一个具有不同名称的新项目,并订阅相同的事件(在代码中或使用配置文件)。然后启动发布者和每个订阅者的一个实例。发布者发布活动后,您将看到两个订阅者都处理该活动。
答案 1 :(得分:0)
订阅者需要首先启动才能发送他们对订阅活动感兴趣的消息。然后发布者需要启动,有时间处理订阅消息。存储所有订阅后,您才能发布消息。如果您在实际存储所有订阅之前发布消息,NServiceBus将仅将消息发送给它已知道的订阅者。一秒钟后,所有订阅者都可能知道,但到那时你已经发布了你的消息。
当使用持久性持久性(如SQL Server或类似的东西)时,将存储和保留订阅。因此,在重新启动服务后,立即知道所有订户。使用内存存储,每次重新启动发布者时,订阅都会丢失。因此需要等待所有订阅都是进程,这需要更长时间。
这也可能是一个问题,并非每个订阅者实际上都在发送消息,因为您可能会错误地配置该配置。
我自己written a tutorial我自己也可以提供帮助。