經驗分享:Apache Kafka的缺點與陷阱 - Emil Koutanov
我已經協助了一些大型客戶使用Kafka作為訊息傳遞主幹來構建微服務風格的體系結構,並對它的功能和真正使他們發揮作用的用例有了相當好的理解。但是我絕對不是卡夫卡的辯護律師。經歷瞭如此迅速的採用曲線的任何技術都必定會使其受眾兩極分化,並以某種錯誤的方式吸引某些開發人員,Kafka也不例外。像其他任何事情一樣,您需要花費大量時間來全面瞭解Kafka和事件流,然後才能完全熟練並可以利用其能力。一路走來,準備面對一些挫敗感。
我已經整理了一些缺點,這些缺點可能會引起開發人員的挫敗感,或者趕上毫無戒心的初學者。沒有特別的順序:
可調整引數太多
Kafka中的配置引數數量可能不計其數,不僅對於新手來說,對於經驗豐富的專業人士也是如此。可能是除了JVM的唯一例外,我想不出具有這麼多配置引數的另一種其他技術工具了。
這並不是說配置選項不是必需的。但有人想知道,這些引數中有多少可以被人體工程學代替,就像Java對G1所做的那樣。因此,與其指定過多的單個閾值和公差,不如讓運維人員設定效能目標,並讓系統得出最能滿足該目標的最佳值集。
不安全的預設值
這是我對配置選項的最大抱怨。Kafka的作者圍繞其順序和訊息傳遞保證的實力提出了幾項大膽的主張。如果您認為預設值是明智的,那麼您將被原諒,因為預設值應該使安全性勝於其他競爭質量。
Kafka預設值通常會針對效能進行優化,並且在安全性很關鍵的情況下,需要在客戶端上顯式覆蓋預設值。 (效能和安全性是矛盾,kafka的預設值只照顧效能,如果你考慮安全性高於效能,那麼不能使用這些預設值)
幸運的是,設定屬性以保證安全性對效能僅產生很小的影響-卡夫卡仍然是野獸。記住優化的第一條規則:不要這樣做。如果卡夫卡的創作者給予更多考慮,卡夫卡本來會更好。
一些具體示例:
- enable.auto.commit :—預設為true,這會導致使用者每5秒提交一次偏移(由
auto.commit.interval.ms),而不管消費者是否已完成記錄的處理。通常,這不是您想要的,因為它可能導致混合的訊息觸底語義-在使用者失敗的情況下,某些記錄可能會傳遞兩次,而另一些記錄可能根本無法傳遞。預設情況下,應該將其設定為false,讓客戶端應用程式指定提交。
- max.in.flight.requests.per.connection
—預設為5,如果一個(或多個)排隊的訊息超時並重試,則可能導致訊息亂序釋出。這裡應該修改預設為1。
駭人聽聞的工具
命令列引數的命名不一致,並且釋出鍵式訊息的簡單操作要求您跳過:傳遞晦澀的、未記錄的屬性。甚至不支援某些本機功能,例如記錄頭。內建工具的可用性是Kafka社群中眾所周知的痛點。
這真是可恥。這就像買一輛法拉利,但交付的是塑料輪轂蓋。長期以來,大多數Kafka練習者都放棄了現成的CLI實用程式,而轉向其他開源工具(例如Kafdrop,Kafkacat和第三方商業產品,例如Kafka Tool)。
複雜的引導過程
客戶端用於建立代理連線的引導和服務發現過程很複雜,並且容易使使用者感到困惑。最初將為客戶端提供代理地址和埠的列表。然後,客戶端將直接連線到一個地址,發現其餘的代理節點,然後再直接建立與所發現節點的新連線。
在簡單,同質的網路設定中,這非常簡單,其中來自所有客戶端和對等節點的所有連線都遍歷單個入口。在異構網路中,可能存在多個入口點以隔離經紀人對經紀人的通訊,生活在同一本地網路上的內部客戶端以及可能通過Internet連線的外部客戶端。
引導/發現過程需要特殊的配置,需要專用的偵聽器和一組單獨的已通告的偵聽器,這些偵聽器將呈現給連線的客戶端。
搖搖欲墜的客戶端庫
使用Java,Python,.NET和C以外的語言編寫的客戶端庫的質量/成熟度均未達到標準。如果您是Java開發人員,那麼就已經做好了–那就是大多數開發工作的集中地。但是Golang和其他社群在努力獲取穩定的庫方面一直很努力,儘管其中一些“獨立”庫已經存在了好幾年,但我在這些語言中遇到的一些錯誤的數量和嚴重性卻是真正有關。
缺乏真正的多租戶
據Kafka的維護者說,它支援多租戶。其設計僅限於訪問控制列表(ACL)來隔離主題和維護配額,這給客戶端帶來了隔離的幻覺,但並未在管理平面中建立隔離。這就是說您的冰箱支援多租戶,因為它可以讓您將食物存放在不同的架子上。
真正的多租戶解決方案將在較大的物理群集中提供多個邏輯群集。這些邏輯叢集可以單獨管理;例如,一個邏輯叢集中ACL的配置錯誤對其他邏輯叢集沒有影響。
缺乏地域意識
地理複製不是內建於代理程式中的,並且公認的是高效能的Kafka群集和“stretch”拓撲不會混合使用。有一個開源專案 MirrorMaker ,它實際上是一個管道,用於將記錄從一個叢集泵送到另一個叢集,而不保留任何關鍵的後設資料(例如偏移量)。
Confluent擁有其專有工具Replicator ,該工具 將保留後設資料,但它是許可的Confluent Enterprise套件的一部分。
總而言之,儘管有上述幾點,我也不會說卡夫卡是垃圾-相反。當然,Kafka並非沒有缺陷。輕描淡寫地說,工具是低於標準的。Kafka的配置選項的廣度是壓倒性的,預設設定中充斥著陷阱,隨時可以震驚那些毫無戒心的初學者。
但是,作為事件流平臺,Kafka改變了我們現在架構和構建複雜系統的方式。它為我們提供了選擇,這是一件好事。它的好處超越了多餘的東西,並且使那些已經被如此積極採用的技術束縛住了所有的麻煩。
相關文章
- Kafdrop是Apache Kafka的開源Web UI視覺化介面 - Emil KoutanovApacheKafkaWebUI視覺化
- 優步分享基於Apache Kafka的Presto使用經驗ApacheKafkaREST
- Apache與Nginx的優缺點比較ApacheNginx
- PyTorch經驗指南:技巧與陷阱PyTorch
- kafka的優缺點都有那些Kafka
- 殺死Apache Kafka:過度架構的陷阱 - Stephanie SherriffApacheKafka架構
- 分享一些 Kafka 消費資料的小經驗Kafka
- 對單體系統優缺點評判到位:拆分Shopify單體工程的經驗分享
- 經驗分享:RabbitMQ與Kafka等訊息系統的使用者討論 - ycombinatorMQKafka
- Nginx/Tomcat/Apache的優缺點和區別NginxTomcatApache
- Spring 對Apache Kafka的支援與整合SpringApacheKafka
- Apache Kafka的4個混沌工程實驗 | IDCFApacheKafka
- 簡單比較 Apache Kafka 和 Apache Pulsar要點 - JaroslawApacheKafkaJARROS
- HTTPS 優點與缺點HTTP
- 經驗分享
- Matlab專案經驗分享-去除震盪點Matlab
- Apache與Nginx的優缺點、效能比較,到底選擇哪個比較好?ApacheNginx
- Scrum與OKR融合實踐經驗分享ScrumOKR
- Apache Pulsar 與 Apache Kafka 在金融場景下的效能對比分析ApacheKafka
- HBase 與 Cassandra 架構對比分析的經驗分享架構
- 6條經過驗證的創業經驗分享創業
- 02 SVN 與 Git 的優缺點Git
- 如何在Kafka中將嚴格順序與大規模並行性結合? - EmilKafka並行
- 【知識分享】DNS伺服器的優缺點DNS伺服器
- serverless與容器優缺點Server
- Apache Kafka 的基本概念ApacheKafka
- Apache Kafka教程--Kafka新手入門ApacheKafka
- Nuxt開發經驗分享,讓你踩少點坑!UX
- 【高中經驗分享】2021.11.29
- Polymer使用經驗分享
- Cloudflare 從 PHP 到 Go:遷移與經驗分享CloudPHPGo
- 從零到一,全面掌握Apache DolphinScheduler發版流程,實戰派經驗分享!Apache
- 經驗分享:乾淨整潔程式碼(clean code)的特點 - oliver
- 【Django】有關多使用者管理的一點小經驗分享Django
- Git版本控制與優缺點Git
- .NET 6 Minimal API 的經驗分享API
- GitHub CSP應用的經驗分享Github
- Netflix採用GraphQL的經驗分享