我的第二個消費者沒有收到訊息

 常見問題 > 錯誤 > 我的第二個消費者沒有收到訊息

情境

  • 您傳送 100 則訊息到一個佇列。
  • 啟動消費者 A,它接收到訊息。
  • 您啟動另一個消費者 B,它沒有收到任何訊息。
  • 您終止 A。
  • 消費者 B 現在收到訊息了,為什麼?

解答

這與預先提取緩衝區有關。

ActiveMQ Classic 會盡可能快地將許多訊息傳遞給每個消費者,以實現最大吞吐量。這表示每個消費者通常在 RAM 中都有 100-1000 則訊息準備好處理,這樣在高訊息吞吐量期間,就不會因為等待另一個訊息到達而產生延遲。

問題是,如果消費者 A 設定的預先提取值 >= 100,那麼它會在消費者 B 啟動之前接收到所有訊息。然後當 B 啟動時,實際上沒有訊息可分派給 B(因為它們都已分派給 A),直到

  • 新的訊息被傳送到佇列
  • 消費者 A 停止或其 JVM 終止

這個問題的解決方案是將預先提取值設定為較小的值,例如 1,一起啟動消費者,或在消費者啟動後發布訊息。

您也可以變更分派策略以確保循環分派。

為了幫助診斷這類問題,請嘗試JMXWeb 控制台

另請參閱

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛標誌和 Apache ActiveMQ 專案標誌是 The Apache Software Foundation 的商標。Copyright © 2024, The Apache Software Foundation。根據Apache License 2.0授權。