设计您的 Azure 服务总线主题 - 您应该喜欢使用更多主题还是更多筛选器?

Designing your Azure Service Bus topics - should you favor the use of more topics, or more filters?

我正处于设计我们的两个企业应用程序如何广播到 Azure 服务总线中的主题的高级结构的早期阶段。我是这项技术的新手,在初步阅读文档后,我很想使用一个简单的解决方案:为我们要广播的每个不同事件类型使用一个单独的主题。

我更喜欢这个解决方案(而不是使用过滤器),因为它提供了对共享访问密钥的最精细控制、最少的消息吞吐量,并且还允许在每个主题的基础上轻松添加和删除订阅。

另一种解决方案是使用较少的主题(将多个事件发送到单个主题),然后配置过滤器以确定每条消息是否应该发送到订阅。从维护的角度来看,这似乎不必要地更复杂,也更不方便。当我可以创建数千个主题时,为什么还要费心使用过滤器?

任何人都可以提供有关最佳方法的反馈吗?

拓扑是一个有趣的话题(没有双关语意)。

说到Azure Service Bus,我很习惯将消息分为两大类的概念

  1. 命令
  2. 活动

命令有一个单一的目的地和对工作的期望。它们为要执行的工作携带足够的信息,并且通常发送者希望看到响应。

事件旨在通知 N 个订阅者发生的事实,而不携带太多信息或对接收者有任何期望。 N 可以是一个或多个(甚至 none)订阅者。对于订阅者应该如何处理事件没有期望,因此发布者和订阅者是分离的。

对于命令,我更喜欢队列。队列只能由单个逻辑接收者使用。没有机会将同一命令传递给多个逻辑收件人。这也有助于 scaling-out/in 接收器基于预期处理的 load/work。这并不意味着 必须 以这种方式实施。你可以用一个订阅来做一个主题并达到同样的效果。但这意味着消息需要 "travel" 在内部从主题到订阅,这也是队列。这种方法的好处 可能 可以增加额外的订阅者,但我会问这是否不是 YAGNI 场景。

对于事件,一个或多个具有多个订阅的主题。单个主题减少耦合量 - 订阅者只需要知道该主题而不是多个主题。

希望这些信息对您有所帮助。

Can anyone provide feedback on the best approach?

将总结为听到所有建议,但根据您的需求验证这些建议。没有最好的方法,有一些选项可以帮助您得出满足系统需求的方法。

免责声明:我所描述的内容与 NServiceBus 实现的 topologies 非常一致,只是我添加了一些变体。