來源:互聯網
上載者:User
關鍵字
kafka
java
php
python
apache
各位大神,小弟最近研究kafka,看了很多說kafka可能會丟失訊息。
實在不太明白做日誌系統,在什麼情境下可以容忍訊息的丟失。
比如做即時日誌分析系統的話,那麼就是說我所看到的日誌資訊中可能是不全的,如果出現異常日誌看不到可能會影響問題的定位?
還有看到說分布式叢集kafka的某一節點崩潰可能也會導致這一節點訊息的丟失(這個看kafka與rabbitMQ做對比的時候說到的,rabbitMQ不會有這個問題)。
如果說kafka這麼不靠譜,為啥這麼多大公司都在使用呢?
回複內容:
各位大神,小弟最近研究kafka,看了很多說kafka可能會丟失訊息。
實在不太明白做日誌系統,在什麼情境下可以容忍訊息的丟失。
比如做即時日誌分析系統的話,那麼就是說我所看到的日誌資訊中可能是不全的,如果出現異常日誌看不到可能會影響問題的定位?
還有看到說分布式叢集kafka的某一節點崩潰可能也會導致這一節點訊息的丟失(這個看kafka與rabbitMQ做對比的時候說到的,rabbitMQ不會有這個問題)。
如果說kafka這麼不靠譜,為啥這麼多大公司都在使用呢?
rabbitMQ怎麼做的,我不知道。
kafka會丟訊息主要集中在兩個環節
訊息落盤時機
訊息落盤有非同步重新整理和同步重新整理兩種,明顯非同步重新整理的可靠性要高很多。但在某些情境下追求效能而忽略可靠性,可以啟用。
訊息儲存維護
持久化儲存,這句話不是說來玩的。Oracle/MySQL做了這麼久的儲存,其中的災難恢複工具等都非常完備並形成體系(出問題你能找到人並能解決問題)kafka的儲存誰特麼知道~工具又特麼的少!
另外就是落盤的儲存介質,如果不做raid,那麼單盤存在損壞的可能;做了raid,則成本上升。如果做多集copy,則存在網路同步延時所帶來的瞬間資料不一致。
小結:kafka你要做到完全不丟資料(在非大災大難的情況下,比如機房被原子彈轟炸;或者raid被誤操作弄錯同步時間或者低格等),是完全可以的。代價就是丟失一定的效能。
所以kafka我一般用在業務允許少量資料丟失但整體輸送量非常大的情境(比如日誌採集),資料統計分析(卻少幾百條資料不會對億萬級的樣本空間產生什麼影響)。
kafka也可以用在兩個可靠儲存之間做資料同步,比如MySQL(寫)->MySQL(度),因為MySQL(寫)保證了資料可被重放,所以kafka出問題時恢複速度和恢複可靠程度是可以得到保證的。