問題現象
用戶上傳 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) |
解決方案
需要調整兩個地方
- Topic 層級:max.message.bytes = 10485880
- Producer 層級:max.request.size = 10485760
使用 CMAK 調整 Topic 設定
進入 Topic 設定頁面,修改 max.message.bytes 的值。
Producer 程式碼調整
Properties props = new Properties();
props.put("max.request.size", 10485760); // 10MB
最佳實踐
何時該增加訊息大小限制?
- 批次匯入大量資料
- 傳輸檔案內容
- 包含大量嵌套資料的 JSON
何時該拆分訊息?
- 可以分批處理的資料
- 不需要原子性的操作
- 對延遲敏感的場景
注意事項
- 記憶體影響:大訊息會增加 Broker 和 Consumer 的記憶體壓力
- 網路傳輸:大訊息增加網路延遲
- Replication:大訊息會拖慢副本同步
Kafka 不是萬能的,大資料量的傳輸要考慮是否適合走 Queue,或者應該用其他方式(如物件儲存 + 訊息通知)。
發佈留言