比方說,有用於執行任務列表[T]一批API。爲了完成這項工作,所有的任務都需要推到卡夫卡。有兩種方法做到這一點:生產批次消息
1)在卡夫卡 2)推動各個工作T卡夫卡
我相信方法1會更好,因爲我沒有推推列表作爲消息消息發送到單個批次調用的多個時間段。有人能告訴我這種方法是否有害嗎?
比方說,有用於執行任務列表[T]一批API。爲了完成這項工作,所有的任務都需要推到卡夫卡。有兩種方法做到這一點:生產批次消息
1)在卡夫卡 2)推動各個工作T卡夫卡
我相信方法1會更好,因爲我沒有推推列表作爲消息消息發送到單個批次調用的多個時間段。有人能告訴我這種方法是否有害嗎?
卡夫卡製作人可以在短時間窗口內發送個別信息(特別配置爲linger.ms
),因此發送單個信息的成本可能比您想象的要低很多。
可能要考慮一個更重要的因素是消費者將如何使用消息。例如,如果消費者無法處理其中一項任務,會發生什麼情況?如果消費者只是打電話給一些其他基於批處理的API成功或失敗,那麼包含任務列表的單個消息將非常合適。另一方面,如果消費者最終必須單獨處理任務,那麼發送單個消息可能更適合,並且可能會使您無需在消費者中實施某種重試邏輯,因爲您可能可以配置Kafka的行爲你需要的語義。
從卡夫卡v0.11開始,你也可以使用交易生產者原子發佈整批。即您開始交易,然後通過消息發佈您的任務消息,最後您提交交易。即使消息可以多批次發送給卡夫卡,只要您的消費者以讀取提交模式運行,它們只會在您提交事務後纔會對消費者可見。
非常感謝邁克爾:) –
選項1是在卡夫卡優選的方法,只要該整批應始終保持在一起。如果將記錄列表作爲批處理髮布,則它們將作爲批處理進行存儲,它們將(可選)作爲批處理進行壓縮,從而產生更好的壓縮效果,並且由消費者將其作爲批處理提取,從而產生更少的提取請求。
如果您發送的單個郵件,那麼你將必須給他們一個共同的關鍵否則它們可能會分散在不同的分區,並可能被髮送出去的順序,或以不同消費者的消費羣。
非常感謝湯姆:) –