我的第二個消費者沒有收到訊息
常見問題 > 錯誤 > 我的第二個消費者沒有收到訊息
情境
- 您傳送 100 則訊息到一個佇列。
- 啟動消費者 A,它接收到訊息。
- 您啟動另一個消費者 B,它沒有收到任何訊息。
- 您終止 A。
- 消費者 B 現在收到訊息了,為什麼?
解答
這與預先提取緩衝區有關。
ActiveMQ Classic 會盡可能快地將許多訊息傳遞給每個消費者,以實現最大吞吐量。這表示每個消費者通常在 RAM 中都有 100-1000 則訊息準備好處理,這樣在高訊息吞吐量期間,就不會因為等待另一個訊息到達而產生延遲。
問題是,如果消費者 A 設定的預先提取值 >= 100,那麼它會在消費者 B 啟動之前接收到所有訊息。然後當 B 啟動時,實際上沒有訊息可分派給 B(因為它們都已分派給 A),直到
- 新的訊息被傳送到佇列
- 消費者 A 停止或其 JVM 終止
這個問題的解決方案是將預先提取值設定為較小的值,例如 1,一起啟動消費者,或在消費者啟動後發布訊息。
您也可以變更分派策略以確保循環分派。