慎用Kafka作為長時間任務(wù)的消息隊列服務(wù)

Kafka是一個知名的流處理框架,同時也可以作為消息隊列使用,但至少在官方描述中狮惜,Kafka不被承認(rèn)是消息隊列服務(wù)。

一開始我對官方這個描述是無感知的碌识,因為Kafka太優(yōu)秀了碾篡,性能優(yōu)越、低延遲筏餐、真正的分布式服務(wù)开泽,理論上是可以勝任消息隊列服務(wù)的,但是后來我發(fā)現(xiàn)我錯了魁瞪。

起源是在一個高并發(fā)項目中使用Kafka穆律,因為并發(fā)量比較大,所以使用Kafka作為削峰作用导俘。至此我仍然看不出所謂流處理跟消息隊列有什么區(qū)別峦耘,因為這部分的任務(wù)都非常簡單,純純是對數(shù)據(jù)庫的插入操作旅薄,可以在極短的時間內(nèi)完成辅髓,這部分Kafka跑得很好。

但是后面我有一些長時間的任務(wù),需要到消息隊列洛口,出于程序員慣有的技術(shù)惰性矫付,我也懶于再增加一個類似Rabbitmq的經(jīng)典消息隊列服務(wù),認(rèn)為Kafka也能勝任這個任務(wù)绍弟,但事實證明我錯了技即,我付出了比選型Rabbitmq百倍的代價,才將Kafka調(diào)教得勉強能作為消息隊列使用樟遣,而且并沒有像Rabbitmq那樣好用。

一切的悲劇在于我忽視了官方那句話:“Kafka并不是消息隊列服務(wù)”身笤。

分析

我總結(jié)了一下Kafka不適合作為長時間任務(wù)的消息隊列服務(wù)的原因:

  1. 超時問題

    作為真正的分布式服務(wù)豹悬,Kafka不但保證服務(wù)端是高可用的,并且保證消費者也是高可用的液荸,因此就需要有一定手段來檢測客戶端是否存活瞻佛,而檢測方案是通過心跳檢測來實現(xiàn)的,一旦心跳間隔大于預(yù)設(shè)的超時時間娇钱,即可判斷消費者是失活狀態(tài)伤柄,從而將它暫時踢出消費者組。

    但是讓我感到無比震驚的是文搂,Kafka居然是直接用任務(wù)本身作為心跳機制适刀。什么意思呢?就是接收任務(wù)和完成任務(wù)ACK作為心跳煤蹭,并且沒有任何的配置可以新開一個線程來做心跳存活笔喉。

    這樣會給長時間任務(wù)帶來一個矛盾點:

    如果超時時間設(shè)置得太短,任務(wù)還沒跑完硝皂,Kafka服務(wù)端會認(rèn)定心跳檢測不通過常挚,從而認(rèn)為消費者存在故障,于是將任務(wù)重新分配給其他消費者稽物,這將導(dǎo)致任務(wù)被重復(fù)消費奄毡,這個過程會一直輪回,最終導(dǎo)致所有消費者都卡在同一任務(wù)上不停重復(fù)執(zhí)行贝或;

    如果超時時間設(shè)置得太長吼过,那任務(wù)是可以正常跑完,但是心跳的機制就完全失效傀缩,更加可怕的是那先,消費者要是故障退出,那服務(wù)端也需要等待漫長的超時時間才能認(rèn)為消費者是異常退出了赡艰,即使你把消費者重新拉起來售淡,也沒用,因為服務(wù)端會認(rèn)為之前的任務(wù)還在運行中,需要等待超時時間過去了揖闸,任務(wù)才能重新被消費揍堕。

    我查閱了大量資料,也沒有找到解決辦法汤纸,因為衩茸,確實沒有任何的配置可以新開一個線程來做心跳存活,那怎么整都是白搭贮泞。

  2. 分片機制

    不同于Rabbitmq的搶占式消費楞慈,Kafka的消費能力完全取決于topic的分片數(shù)量,體現(xiàn)有兩點:

    1. 每個分片必須對應(yīng)一個消費者啃擦,換言之囊蓝,消費者組里面的消費者數(shù)量比分片少的時候,將會有部分分片沒法被消費令蛉。

    2. 當(dāng)Kafka消費者組中的消費者數(shù)量大于topic的分片(分區(qū))數(shù)量時聚霜,多余的消費者會處于備用狀態(tài),不會消費任何消息珠叔。每個分區(qū)只能分配給一個消費者蝎宇,所以多余的消費者會空閑等待,跟CPU上的一核有難多核圍觀差不多祷安。

    這就導(dǎo)致消費者無法像Rabbitmq那樣無限水平伸縮姥芥,并且Kafak的分片只能伸不能縮,要是你前期伸得太多了辆憔,那就只能哭了撇眯,祈求領(lǐng)導(dǎo)給你分配的消費者資源足夠多吧。

  3. 沒有優(yōu)先級

    優(yōu)先級是消息隊列非常經(jīng)典的功能虱咧,而Kafka是沒有的熊榛,畢竟它并非傳統(tǒng)意義的上消息隊列。偏要在Kafka上實現(xiàn)優(yōu)先級的話腕巡,那得按優(yōu)先級設(shè)置多個topic和多組消費者玄坦,屬實不方便。

為了解決上述1和2兩個問題绘沉,我想出了一個尚且能解決問題的辦法煎楣,那就是在大循環(huán)里面,按照“消費者連接服務(wù)端->獲取消息->消費者退出->處理消息”這樣循環(huán)车伞,這樣在一定程度上能緩解癥狀择懂,但卻喪失了ACK的作用,并且顯得與正常的Kafka消費方式格格不入另玖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末困曙,一起剝皮案震驚了整個濱河市表伦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慷丽,老刑警劉巖蹦哼,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異要糊,居然都是意外死亡纲熏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門锄俄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來局劲,“玉大人,你說我怎么就攤上這事奶赠∪菸眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵车柠,是天一觀的道長。 經(jīng)常有香客問我塑猖,道長竹祷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任羊苟,我火速辦了婚禮塑陵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜡励。我一直安慰自己令花,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布凉倚。 她就那樣靜靜地躺著兼都,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稽寒。 梳的紋絲不亂的頭發(fā)上扮碧,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音杏糙,去河邊找鬼慎王。 笑死,一個胖子當(dāng)著我的面吹牛宏侍,可吹牛的內(nèi)容都是我干的赖淤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谅河,長吁一口氣:“原來是場噩夢啊……” “哼咱旱!你這毒婦竟也來了确丢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤莽龟,失蹤者是張志新(化名)和其女友劉穎蠕嫁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毯盈,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡剃毒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搂赋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赘阀。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脑奠,靈堂內(nèi)的尸體忽然破棺而出基公,到底是詐尸還是另有隱情,我是刑警寧澤宋欺,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布轰豆,位于F島的核電站,受9級特大地震影響齿诞,放射性物質(zhì)發(fā)生泄漏酸休。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一祷杈、第九天 我趴在偏房一處隱蔽的房頂上張望斑司。 院中可真熱鬧,春花似錦但汞、人聲如沸宿刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僵缺。三九已至,卻和暖如春是目,著一層夾襖步出監(jiān)牢的瞬間谤饭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工懊纳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揉抵,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓嗤疯,卻偏偏與公主長得像冤今,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茂缚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容