2

我有:
- 一个带有 QUEUE0 的订阅者 SUB - 带有 QUEUE1 的
发布者 PUB1 - 带有 QUEUE2的
发布者 PUB2 -两个发布者都发布了
事件MyEvent

何时:
- SUB 仅使用队列名称 QUEUE1 显式订阅 PUB1

subscriberEndpointConfiguration.UnicastRouting().AddPublisher("PUB1", typeof(MyEvent));

结果:
- SUB 也接收MyEvent来自 PUB2(队列名称为 QUEUE2)

预期:
- SUB 不应该MyEvent从 PUB2 接收,因为它没有订阅该发布者队列名称

来自 NSB 维基:

订阅者表示对一个或多个类感兴趣,并且只接收感兴趣的消息,而不知道有哪些发布者(如果有的话)

问题

  1. 在上面显示的方法中指定发布者端点有什么意义AddPublisher?Azure 表存储中的订阅表只有一个事件类型和一个订阅者列,不存储发布者端点。

  2. 如果AddPublisher是某种过时的方法,那么endpointInstance.Subscribe<MyEvent>()简单地失败 - 它说“找不到发布者”。

  3. 是否可以对发布者进行范围/分组,以便只有一种事件类型MyEvent,订阅者将接收来自仅使用相同队列名称创建的发布者的事件?
    例如,您使用 QUEUE-A 创建 PUB1,使用队列 QUEUE-A 创建 PUB2,使用 QUEUE-B 创建 PUB3,使用 QUEUE-A 创建 SUB AddPublisher,因此 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

4

2 回答 2

3
  1. Azure 存储队列传输支持使用持久性的发布/订阅。需要指定发布者端点以允许订阅者在启动时发送订阅消息。默认情况下,所有端点都使用相同的共享存储表,这就是您体验所描述内容的原因。如果您为每个端点拆分订阅(每个端点都有自己的存储表),您会看到 SUB 只会在 PUB1 是它订阅的唯一发布者时接收来自 PUB1 的事件。

  2. AddPublisher()不是过时的方法。过时的消息将被标记为这样。话虽如此,路由功能仍然可以在我们现在处于的 beta 阶段进行修改。

  3. 范围界定可以按照 Philip 概述的方式进行。同时,我鼓励您研究为什么您有两个不同的端点生成相同的事件。通常,您希望事件是唯一的并由单个端点(或所有实例)引发,而不是两个或多个不同的端点。

于 2016-07-06T20:44:39.857 回答
1

除了自己的队列之外,每个发布者还需要自己的持久性表。

当您设置每个发布者的IEndpointInstance

busConfiguration
   .UsePersistence<AzureStoragePersistence, StorageType.Subscriptions>()
   .TableName("NameOfPublisher")

有关更多信息,请参阅文档:http: //docs.particular.net/nservicebus/azure-storage-persistence/configuration

于 2016-07-06T20:36:38.297 回答