掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者: IT明哥 2021-09-09 06:55:43
開發(fā)
架構(gòu)
Kafka KAFKA 作為開源分布式事件流平臺,在大數(shù)據(jù)和微服務(wù)領(lǐng)域都有著廣泛的應(yīng)用場景,是實(shí)時(shí)流處理場景下消息隊(duì)列事實(shí)上的標(biāo)準(zhǔn)。用一句話概括,KAFKA 是實(shí)時(shí)數(shù)倉的基石,是事件驅(qū)動架構(gòu)的靈魂。

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、沙河ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的沙河網(wǎng)站制作公司
本文轉(zhuǎn)載自微信公眾號「明哥的IT隨筆」,作者 IT明哥 。轉(zhuǎn)載本文請聯(lián)系明哥的IT隨筆公眾號。
大家好,我是明哥!
KAFKA 作為開源分布式事件流平臺,在大數(shù)據(jù)和微服務(wù)領(lǐng)域都有著廣泛的應(yīng)用場景,是實(shí)時(shí)流處理場景下消息隊(duì)列事實(shí)上的標(biāo)準(zhǔn)。用一句話概括,KAFKA 是實(shí)時(shí)數(shù)倉的基石,是事件驅(qū)動架構(gòu)的靈魂。
但是一些技術(shù)小伙伴,尤其是一些很早就開始使用 KAFKA 的技術(shù)小伙伴們,對 KAFKA 的發(fā)展趨勢和一些新特性,并不太熟悉,在使用過程中也踩了不少坑。
有鑒于此,我們接下來會有一個(gè) KAFKA 系列文章,專門講述 KAFKA 的這些新特性。
本文是該系列文章之一,講述 KAFAK 的冪等生產(chǎn)者。
以下是正文。
首先我們從歷史視角,看下 KAFKA 的發(fā)展:
kafka-timeline
kafka-api
我們知道,當(dāng) kafka producer 向 broker 中的 topic發(fā)送數(shù)據(jù)時(shí),可能會因?yàn)榫W(wǎng)絡(luò)抖動等各種原因,造成 producer 收不到 broker 的 ack 確認(rèn)信息。此時(shí) producer 有兩種選擇:
producer 可以選擇忽略沒有收到 ack 確認(rèn)消息,不做任何進(jìn)一步處理:此時(shí)有可能會丟失消息。(之所以說有可能,是因?yàn)橄⒂锌赡軟]有寫到 broker 的topic 中,但也有可能已經(jīng)正確地寫到了 broker 的 topic 中,只是回調(diào)的 ack 消息因網(wǎng)絡(luò)抖動 producer 沒有收到;)
producer 也可以選擇多次嘗試重發(fā)消息,直到收到ack 確認(rèn)消息或重試最大次數(shù)到達(dá): 此時(shí)有可能會造成消息的重復(fù)寫,即 broker 端的 topic 中,重復(fù)地存儲了重試發(fā)送的這些消息;
producer 重發(fā)沒有收到 ack 確認(rèn)的消息, 也可能會造成 broker 端 topic 的 partition 中 消息的順序混亂,即因失敗重發(fā)的消息在部分沒有失敗不需要重發(fā)的消息之后。
因 producer 重發(fā)沒有收到 ack 確認(rèn)的消息造成數(shù)據(jù)重復(fù)的問題,可以參見如下示意圖,圖中 message 7/8/9/10 即為重復(fù)的消息。
producer-resend-failure
KAFKA 的冪等生產(chǎn)者即 idempotent producer,就是解決上述問題的:它可以確保消息被正確地投遞到 broker端,不會丟失沒有重復(fù),而且是以正確的順序存儲在 topic 的各個(gè) partition 中。
首先需要說明下,在啟用冪等生產(chǎn)者的情況下,消息失敗時(shí)的重新發(fā)送,是由 kafka client 自動實(shí)現(xiàn)的,對我們來講是透明的,我們不需要在代碼中重試發(fā)送。(事實(shí)上,在代碼中重試消息發(fā)送,反而會引起消息重復(fù)).
其內(nèi)部工作原理如下:
冪等生產(chǎn)者是 kafka 事務(wù)的必要不充分條件,即:
開啟冪等生長者,不一定需要開啟事務(wù);
開始 kafka 事務(wù),必須要開啟冪等生產(chǎn)者;
事實(shí)上,開啟 kafka事務(wù)時(shí),kafka 會自動開啟冪等生產(chǎn)者。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流