選擇容器

2.0 版本引入了 DirectMessageListenerContainer (DMLC)。先前,僅有 SimpleMessageListenerContainer (SMLC) 可用。SMLC 為每個消費者使用內部佇列和專用線程。如果容器設定為監聽多個佇列,則相同的消費者線程會用於處理所有佇列。並行性由 concurrentConsumers 和其他屬性控制。當訊息從 RabbitMQ 用戶端抵達時,用戶端線程會透過佇列將它們交給消費者線程。早期版本的 RabbitMQ 用戶端不支援多個並行交付,因此需要此架構。較新版本的用戶端具有修訂的線程模型,現在可以支援並行性。這使得 DMLC 的引入成為可能,現在監聽器直接在 RabbitMQ 用戶端線程上調用。因此,其架構實際上比 SMLC「更簡單」。但是,這種方法有一些限制,並且 SMLC 的某些功能在 DMLC 中不可用。此外,並行性由 consumersPerQueue (和用戶端程式庫的線程池) 控制。`concurrentConsumers` 和相關屬性在此容器中不可用。

以下功能在 SMLC 中可用,但在 DMLC 中不可用

  • batchSize: 使用 SMLC,您可以設定此項來控制在交易中交付多少訊息或減少 ack 的數量,但這可能會導致失敗後重複交付的訊息數量增加。(DMLC 確實有 messagesPerAck,您可以使用它來減少 ack,與 batchSize 和 SMLC 相同,但它不能與交易一起使用 — 每個訊息都在單獨的交易中交付和 ack)。

  • consumerBatchEnabled: 啟用消費者中離散訊息的批次處理;有關更多資訊,請參閱 訊息監聽器容器設定

  • maxConcurrentConsumers 和消費者擴展間隔或觸發器 — DMLC 中沒有自動擴展。但是,它允許您以程式化方式變更 consumersPerQueue 屬性,並且消費者會相應地調整。

但是,DMLC 比 SMLC 具有以下優勢

  • 在執行時新增和移除佇列更有效率。使用 SMLC,整個消費者線程會重新啟動 (所有消費者都取消並重新建立)。使用 DMLC,未受影響的消費者不會被取消。

  • 避免了 RabbitMQ 用戶端線程和消費者線程之間的上下文切換。

  • 線程在消費者之間共享,而不是像 SMLC 那樣為每個消費者分配專用線程。但是,請參閱 線程與非同步消費者 中關於連線工廠設定的「重要」注意事項。

有關哪些設定屬性適用於每個容器的資訊,請參閱 訊息監聽器容器設定