我有:
- 一个订户SUB与QUEUE0
- 出版商PUB1与QUEUE1
- 出版商PUB2与QUEUE2
- 两个发布商发布的事件MyEvent
当:
- SUB显式订阅PUB1,队列名称仅为QUEUE1
subscriberEndpointConfiguration.UnicastRouting().AddPublisher("PUB1", typeof(MyEvent));
结果:
- SUB还从PUB2(队列名称为QUEUE2)
MyEvent
预期:
- SUB不应从PUB2收到MyEvent
,因为它未订阅该发布者队列名称
来自NSB wiki:
订阅者表达对一个或多个课程的兴趣,并且只接收感兴趣的消息,而不知道哪些发布者(如果有的话)有
问题:
在上面显示的AddPublisher
方法中指定发布商端点的重点是什么? Azure表存储中的订阅表仅包含事件类型和订阅者列,不存储发布者端点。
如果AddPublisher
是一种过时的方法,那么endpointInstance.Subscribe<MyEvent>()
就会失败 - 它会说&#34;找不到发布商&#34;。
是否可以对发布商进行范围/分组,以便只有一个事件类型MyEvent
,订阅者将从仅使用相同队列名称创建的发布者接收该事件?
例如。你用QUEUE-A创建PUB1,用队列QUEUE-A创建PUB2,用QUEUE-B创建PUB3,用AddPublisher
创建SUB到QUEUE-A,这样SUB就不会从PUB3接收MyEvent
(QUEUE- B)。
我正在使用:
NServiceBus 6.0.0-beta0004
NServiceBus.Persistence.AzureStorage 1.0.0-beta0004
NServiceBus.Azure.Transports.WindowsAzureStorageQueues 7.0.0-beta0004
答案 0 :(得分:3)
Azure存储队列传输支持pub/sub using persistence。指定发布者端点的需要是允许订户在启动时发送订阅消息。默认情况下,所有端点都使用相同的共享存储表,这就是您体验所描述内容的原因。如果您为每个端点拆分订阅(每个端点都有自己的存储表),您会看到SUB只接收来自PUB1的事件,如果这是它订阅的唯一发布者。
AddPublisher()
不是一个过时的方法。废弃的消息将被标记为这样。说到这一点,路由功能仍然可以在我们现在进入的测试阶段进行修改。
可以按照Philip概述的方式进行范围界定。同时,我鼓励调查为什么有两个不同的端点生成相同的事件。通常,您希望事件是唯一的并由单个端点(或所有实例)引发,但不是两个或更多不同的端点。
答案 1 :(得分:1)
每个发布者除了拥有自己的队列外,还需要自己的持久性表。
当您设置每个发布商IEndpointInstance
:
busConfiguration
.UsePersistence<AzureStoragePersistence, StorageType.Subscriptions>()
.TableName("NameOfPublisher")
有关详细信息,请参阅文档:http://docs.particular.net/nservicebus/azure-storage-persistence/configuration