我正在尝试使用Nservice总线实现发布者订阅者模式,我想要做的是如下:
我有网络应用程序,用户可以使用他的帐户编写新闻并向该应用程序添加文档。
我有一个在用户计算机上运行的Windows窗体桌面应用程序,他们可以使用用于访问Web应用程序的相同凭据登录此桌面应用程序。
我需要的是当Web应用程序上的用户添加新闻或documnet时,安装的桌面应用程序应该收到通知,告知它有关此添加的消息.....
我想我的桌面应用程序将是订阅将从服务器发布的事件的订阅者 我需要知道的是
当多个用户(例如1000个用户)在不同的机器上安装此桌面应用程序以开始使用它时,在这种情况下,Nservice总线会将它们视为多个订户,并会将消息的副本发送给每个用户或者什么? ?
答案 0 :(得分:2)
作为described in the documentation,它的工作原理如下:
Send(ICommand command)
,则会将消息直接发送到匹配的目标。在这种情况下,如果您有多个消费者,他们将竞争获取此消息,只有一个获得它。这通常用于扩展应用程序。Publish(IEvent @event)
,您的邮件将会发送给所有订阅者。答案 1 :(得分:1)
当NServiceBus中发生Pub/Sub时,有一个逻辑发布者将事件发送给多个逻辑订阅者。每个逻辑订阅者只会收到已发布的每个事件的一个副本。
如果许多订户代表相同的逻辑实体,则每个事件将仅由该逻辑实体内的一个订户处理。如果两个订户共享Endpoint Name,则认为它们代表相同的逻辑实体。
在这种情况下,如果桌面应用程序的每个实例具有相同的端点名称,则认为它们代表相同的逻辑实体。发布事件时,只有其中一个桌面应用程序实例将获得该事件的副本。这可能不是你想要的。
如果您为桌面应用程序的每个实例提供不同的端点名称,那么它们每个都代表它们自己的逻辑实体。发布事件时,所有桌面实例都将获得该事件的副本。这也可能不是你想要的。
另一件需要考虑的事情是NSB中的pub / sub是持久且可靠的。如果启动桌面应用程序并设置订阅,则即使桌面应用程序处于脱机状态,该订阅也会生效。即使您从未再次运行桌面应用程序,消息也可能排队等待桌面应用程序重新联机以进行处理。您的桌面应用程序是否需要这些,或者您只关心连接时发生的事件?
如果您想在服务器上发生事件时通知在线的特定订户或订户子集,那么我将在使用NSB之前使用SignalR。
其他信息
MSMQ和SQL Server不支持开箱即用的pub-sub,因此他们使用称为消息驱动订阅的功能。消息驱动的订阅通过让订阅者在启动时向发布者发送消息(或调用Subscribe()
)来工作。此消息包含Reply To
标头,发布者将其存储并用于发送每个已发布消息的副本。
对于SQL Server传输,Reply To
地址将是端点的名称。这反过来映射到数据库中表示消息队列的表。如果多个订阅者共享相同的端点名称(因此同一个表),那么他们将获得它们之间的事件的一个副本,并将竞争查看哪个订阅者从队列中提取它。
对于MSMQ,Reply To
地址将是端点的名称,以及由@
符号分隔的计算机名称。这意味着每个订阅将用于不同的地址。当事件发布时,每个订阅者都将获得它自己的副本。如果多个订阅者代表相同的逻辑实体(即共享端点名称),那么您应该拥有distributor in front of them。执行此操作时,传出订阅消息上的Reply To
标头将是分发服务器的地址。当一个事件发布时,它将一直发送给经销商,经销商会将其交给其中一个(也是唯一一个)工人进行处理。
Rabbit MQ和Azure Service Bus具有pub / sub的内置机制,但它们的行为方式与SQL Transport类似。逻辑订户的一个实例将获得该事件的副本。