如何在 Masstransit/RabbitMQ 中组织队列?

How to organize queues in Masstransit/RabbitMQ?

我想了解使用消息的最佳做法。我已经阅读了 MassTransit 文档并搜索了相关内容,但没有得出任何结论。

我有一个 api(托管总线实例)正在发布消息。这些消息是多种多样的,因为这 api 不是微服务(购买、销售等消息)。

我该如何整理我的 consumers/queues?

  1. 一个队列类型的进程?例如一个用于购买,另一个用于销售等,这个解决方案可能涉及到有很多进程,我不确定是否是一个很好的解决方案。如果我想要不同的购买队列怎么办,例如 purchases.stock、purchases.suppliers 等?进程数可能会大大增加。我认为这是一个很好的可伸缩性选项,但管理这么多进程可能会很棘手。
  2. 多个进程队列(按域分组队列)?例如,一个进程有多个消费者消费与购买相关的消息并管理不同的队列,例如 purchases.stock、purchases.suppliers...这个选项对我来说更有意义,但我不确定。

关键概念是避免为不同的消息类型共享单个队列。也有例外,但将每种消息类型保留在单独的队列中可以防止当一种消息类型主导队列流量时出现瓶颈。

至于流程,由于 MassTransit 每个总线实例可以有任意数量的接收端点,因此将相关业务功能保留在单个流程中可以极大地帮助代码管理和部署。流程边界可用于扩展,例如,添加更多 processes/workers 来处理状态更新与新订单(就消息量而言,先验可能是后者的 10 倍)。

分离的另一个原因是依赖性,与具有大量绑定或耦合到外部 libraries/SDKs 的遗留 ERP 系统通信的消费者可能需要一个单独的进程来避免内存问题,因为某些方式创建了较旧的库。这些库可能需要更频繁地重启进程等,将它们分开可以避免为随着时间的推移导致问题的消费者重启一整套消费者。

这些只是一些一般准则,但我们在确定将哪些消费者放入同一进程时一直使用的准则。