首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用NServiceBus实现发布订阅通道

用NServiceBus实现发布订阅通道
EN

Stack Overflow用户
提问于 2016-01-20 15:10:19
回答 2查看 536关注 0票数 0

我正在尝试使用NServiceBus实现发布订阅通道。根据“企业集成模式”()一书,普利什订阅频道被描述为:

发布-订阅通道的工作方式如下:它有一个输入通道,分成多个输出通道,每个订阅者一个。当事件被发布到通道中时,发布订阅通道将消息的副本传递给每个输出通道。通道的每个输出端只有一个订阅服务器,只允许使用一次消息。这样,每个订阅者只收到一次消息,并且消耗掉的副本从他们的通道中消失。 霍普,格雷戈尔;伍尔夫,鲍比(2012-03-09)。企业集成模式:设计、构建和部署消息解决方案(Addison签名系列(Fowler)) (Kindle 2880-2883)。皮尔逊教育。Kindle版

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

即使有多个订阅服务器,也只有一个订阅服务器接收已发布的事件。发布多个事件最多会导致一个订阅服务器处理该事件。

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

更新2016年2月2日

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-21 18:36:35

如果您正在运行同一订阅服务器的多个实例,则所描述的是预期的功能。

场景

1个发布服务器,1个逻辑订阅服务器

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

1个发布服务器,2个逻辑订阅服务器

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

1个发布服务器,2个逻辑订阅服务器实例

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

摘要

如果简单地拆分同一订阅服务器的多个实例,则仍然只有一个订阅服务器处理该事件。这是故意的。否则,每一个额外的过程都会重复这项工作。

如果您希望看到两个逻辑订阅服务器,请在该解决方案中创建一个具有不同名称的新项目,并订阅同一个事件(无论是在代码中还是在配置文件中)。然后启动发布服务器和每个订阅服务器的一个实例。发布事件后,您将看到两个订阅者都处理该事件。

票数 1
EN

Stack Overflow用户

发布于 2016-01-21 07:58:46

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

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

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

我自己也有写了一个教程,这也能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34903655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档