事故背景:
我們公司與合作方公司有個消息同步的需求,合作方是消息生產者,我們是消息消費者,他們通過kafka給我們推送消息,我們實時接收,然后進行后續業務處理。昨天上午,發現他們推送過來的廣場門店信息我們都沒有消費,導致我們系統和他們系統數據不一致,從而導致無法提單,無法出報表(報表有誤)等各種問題
排查過程:
(1)因為coco身體不適,上午請假去醫院了,所以這個問題就轉給我們team的專門運維的同事了,電話大概給他說明了代碼路徑,可惜,半天下來仍然無果,看着微信群里他發的消息,我有點抓狂,根本沒有找到點上,半天了沒查出原因,我們業務端也頂着壓力,一個勁兒地給我打電話。
(2)中午12:30點,coco回到公司,立馬開電腦開始排查,讓他們重新推送消息,查看日志,發現我們根本沒有消費到。初步判斷,應該不是我們客戶端的問題,初步定位原因:a.網絡問題;b.網絡丟包;c.生產者生產機制有問題,實際沒有推送過來。
(3)因為之前一直是好好的,近期這個需求也沒有做過任何改動,網絡也是通的,感覺可能不是網絡的問題,但是也要排查,因為這個已經是去年年初的需求了,原熟悉這塊業務的人早已離職,所以排查起來有點慢。我們公司在合作公司面前又沒多大話語權,每次有問題都是直接甩鍋給我們,每次排查出來都是他們的問題。這次,我讓他們先排查自身問題,他們依然說,不是他們的原因等等。
(4)網絡排查:根據代碼,查出我們連接生產者zookeeper的集群地址。然后我找到我們應用所在主機IP。ping了下是通的。但是telnet端口的時候明顯就不通了,很明顯的網絡問題啊。截圖給對方,他們依然不認,說自己測試都是ok的,coco此時心里真的是一萬個mmp啊,然而,臉上還要笑嘻嘻……為啥之前一直通的,突然就有問題了呢,讓對方研發問他們那邊最近有沒有做過網絡調整,那哥們直接說沒有……涉及公司與公司間的網絡權限,肯定要走流程去申請啦。我就去找我們這邊網絡組的老大,把事故簡要地說明了下,他說,合作方公司前幾天有下線過一批主機呀,我聯系他們,包不包含這幾台,此刻,我的心里大石頭終於放下了,找對人了。
ping的結果:
telnet的結果:
(5)后來,在這個leader、我們項目經理的協調下,找了對方公司的網管,確認是他們近期做了網絡調整導致的。然后,對方公司對接人去提了網絡申請,該問題算是初步得到了解決,下午2:40左右,網絡給打開了,但是我們依然沒有收到消息,他們又重新推送了一條,依然沒有接收到。
(6)分析我們消費端的代碼,處理業務bean上實現的是 InitializingBean類,在初始化bean的時候都會執行該方法。所以,我們這邊的應用需要重啟才行。於是,我又申請重啟應用,因為是核心應用,只能等到晚上才能重啟。
(7)晚上8點左右,應用重啟了,可是,依然沒有消費到消息,理論上他們生產的消息沒有消費,我們是直接可以消費的啊,這個還需要后續查看。我又聯系他們重新推送了幾條數據,我這邊可以消費了。然后他們全量推送了下,該問題得到初步解決。
(8)為什么積壓的消息我們消費不到,仍在研究中。
(9)對於此類初始化時候執行的方法,如果中途有類似網絡問題,該如何處理?
結論:
對於生產正在用的接口,一直好好的,突然出問題,如果是全量問題,首先要排查網絡問題,如果是部分數據有問題,則要考慮是否是網絡丟包,是否是消息丟失。
復盤:
其實,這個問題真的從根源上解決了嗎?並沒有,根據生產日志,查詢得知,自6.5日開始,就沒有消費過消息了,說明6.5號就有問題了啊。我們系統也沒有報異常,沒有通知到負責人,為什么消費者連不上生產者zookeeper主機的時候,仍不報異常呢,這個coco還在排查。
ConsumerConfig conf = new ConsumerConfig(props); //連不通但是沒有報異常
ConsumerConnector consumer = kafka.consumer.Consumer.createJavaConsumerConnector(conf);
代碼: