我有:
- 一个带有 QUEUE0 的订阅者 SUB
- 发布者 PUB1 与 QUEUE1
- 发布商 PUB2 与 QUEUE2
- 事件MyEvent
由两家出版商出版
时间:
- SUB 仅显式订阅队列名称为 QUEUE1 的 PUB1
subscriberEndpointConfiguration.UnicastRouting().AddPublisher("PUB1", typeof(MyEvent));
结果:
- SUB 还收到 MyEvent
来自 PUB2(队列名称为 QUEUE2)
预期:
- SUB 不应收到MyEvent
来自 PUB2,因为它没有订阅该发布者队列名称
来自 NSB 维基:
subscribers express interest in one or more classes, and only receive messages that are of interest, without knowledge of what, if any, publishers there are
问题:
在
AddPublisher
中指定发布者端点有什么意义?上面显示的方法? Azure 表存储中的订阅表只有事件类型和订阅者列,不存储发布者端点。如果
AddPublisher
是某种过时的方法,那么endpointInstance.Subscribe<MyEvent>()
根本就失败了 - 它说“找不到发布者”。是否可以对发布商进行范围/分组,以便只有一种事件类型
MyEvent
订阅者将收到来自仅使用相同队列名称创建的发布者的事件?
例如。您使用 QUEUE-A 创建 PUB1,使用队列 QUEUE-A 创建 PUB2,使用 QUEUE-B 创建 PUB3,使用AddPublisher
创建 SUB到 QUEUE-A,因此 SUB 不会收到MyEvent
来自 PUB3 (QUEUE-B)。
我正在使用:
NServiceBus 6.0.0-beta0004
NServiceBus.Persistence.AzureStorage 1.0.0-beta0004
NServiceBus.Azure.Transports.WindowsAzureStorageQueues 7.0.0-beta0004
最佳答案
Azure 存储队列传输支持pub/sub using persistence 。需要指定发布者端点,以允许订阅者在启动时发送订阅消息。默认情况下,所有端点都使用相同的共享存储表,这就是您遇到所描述的情况的原因。如果您将每个端点的订阅分开(每个端点都有自己的存储表),您会发现 SUB 只会从 PUB1 接收事件(如果 PUB1 是它订阅的唯一发布者)。
AddPublisher()
不是一个过时的方法。过时的消息将被标记为此类。尽管如此,在我们目前所处的测试阶段,路由功能仍然可以修改。范围界定可以按照 Philip 概述的方式完成。同时,我鼓励您研究为什么有两个不同的端点生成相同的事件。通常,您希望事件是唯一的并由单个端点(或所有实例)引发,而不是由两个或多个不同端点引发。
关于nservicebus - 是否可以在 NServiceBus 中对事件发布者进行范围/分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38232098/