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

Jos*_*nge 5 masstransit message-queue servicebus rabbitmq messagebroker

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

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

我该如何组织我的消费者/队列?

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

Chr*_*son 4

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

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

分离的另一个原因是依赖关系,与具有大量绑定或耦合到外部库/SDK 的遗留 ERP 系统进行通信的消费者可能需要一个单独的过程,以避免由于某些旧库的创建方式而导致的内存问题。这些库可能需要更频繁的进程重新启动等,并且将它们分开可以消除随着时间的推移导致问题的消费者重新启动整组消费者的需要。

这些只是一些一般准则,但我们在确定将哪些消费者置于同一流程中时一直使用这些准则。