Kafka 實務坑筆記(四):訊息太大被 Kafka 拒絕

問題現象

用戶上傳 3 個 Excel 檔案匯入訂單:

  • 658 筆 → ✅ 成功
  • 1,628 筆 → ❌ 一直轉圈圈
  • 2,208 筆 → ❌ 一直轉圈圈

資料庫有寫入,但 Queue 卻沒有送出。

錯誤訊息

org.apache.kafka.common.errors.RecordTooLargeException: 
The message is 1649903 bytes when serialized which is larger than 1048576, 
which is the value of the max.request.size configuration.

問題分析

Kafka 預設的訊息大小限制是 1 MB,而我們的 Excel 資料序列化後超過了這個限制。

涉及的設定

層級 設定 預設值
Producer max.request.size 1,048,576 (1MB)
Broker (Topic) max.message.bytes 1,048,576 (1MB)
Broker message.max.bytes 1,048,576 (1MB)

解決方案

需要調整兩個地方

  1. Topic 層級:max.message.bytes = 10485880
  2. Producer 層級:max.request.size = 10485760

使用 CMAK 調整 Topic 設定

進入 Topic 設定頁面,修改 max.message.bytes 的值。

Producer 程式碼調整

Properties props = new Properties();
props.put("max.request.size", 10485760); // 10MB

最佳實踐

何時該增加訊息大小限制?

  • 批次匯入大量資料
  • 傳輸檔案內容
  • 包含大量嵌套資料的 JSON

何時該拆分訊息?

  • 可以分批處理的資料
  • 不需要原子性的操作
  • 對延遲敏感的場景

注意事項

  1. 記憶體影響:大訊息會增加 Broker 和 Consumer 的記憶體壓力
  2. 網路傳輸:大訊息增加網路延遲
  3. Replication:大訊息會拖慢副本同步

Kafka 不是萬能的,大資料量的傳輸要考慮是否適合走 Queue,或者應該用其他方式(如物件儲存 + 訊息通知)。

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *