關於kafka處理大訊息的方法

2021-08-22 00:21:58 字數 1010 閱讀 6869

最近發現kafka在傳送一些大訊息的時候會報錯,修改了配置max.request.size。問題依舊。

後來查閱了一下,都說要調大限制message大小的引數,不過試過之後發現貌似沒什麼作用。查閱文件發現之前用的客戶端kafka已經三年沒更新了0.0,後改為目前官方推薦的客戶端confluent_kafka,加上"message.max.bytes"引數。然而依舊沒什麼作用。。。

改道!!!初步制定了三個方案。

一。引用外部儲存,然後用kafka推送位址。

覺得這個方法不是太好。首先需要維護外部儲存,然後kafka的消費端拿到資料後需要在判斷。而且這些資料並不是我們要的最終形態。而且這個儲存儲存多久呢?在時間和空間上都有浪費。

二。壓縮

kafka的資料支援壓縮,初步測試了一下,壓縮率還可以。但是還有其他的問題。如果資料重複的內容比較少,或者壓縮率很低,再或者壓縮後的大小依然超過了1m,那麼怎麼辦。而且帶來了第二個問題。在處理壓縮的大檔案時,處理時間會比較長,會引發timeout問題。再消費過程中,一條大訊息還沒消費完,已經timeout,那麼offset並沒有遞交偏移,就會出現重複消費,死迴圈的問題!!!

三。切片

將大訊息分隔成多個,然後通過在客戶端指定key的方式,將資料傳送到同乙個partition。

kafka的機制是通過key計算乙個hashcode,然後用hashcode/partition去餘,然後傳送到對應的partition。從而保證相同的key,訊息儲存在同乙個partition。

kafka在同乙個partition中的訊息是有序的。

這樣在消費端拿到資料,只需要做個快取拼接就可以了。有人可能擔心,如果同乙個group_id中有多個消費者,會不會導致訊息亂了呢?這裡要說一下kafka的機制。kafka推薦partition的個數最好是相同group_id中客戶端數的整數倍。是因為kafka同組呢的訊息分發,不是分配的訊息,而是分配的partition。這樣就保證了同組中無論有多少個消費者,同乙個partition的資料都只會被乙個消費者消費。切片的方法麻煩一點,不過一勞永逸,而且能保證高效的傳輸。

php處理kafka訊息

php如果要使用kafka的話,需要安裝一下kafka php composer require nmred kafka phpkafka php的github位址 先寫乙個kafka producer.php,用來做為生產者 require var www extend vendor autolo...

關於golang接入Kafka訊息佇列的記錄

version 2 services zookeeper image wurstmeister zookeeper ports 2181 2181 kafka build image wurstmeister kafka volumes var run docker.sock var run doc...

kafka中處理超大訊息的一些處理

kafka設計的初衷是迅速處理短小的訊息,一般10k大小的訊息吞吐效能最好 可參見linkedin的kafka效能測試 但有時候,我們需要處理更大的訊息,比如xml文件或json內容,乙個訊息差不多有10 100m,這種情況下,kakfa應該如何處理?針對這個問題,有以下幾個建議 不過如果上述方法都...