kafka reassign 限速_RabbitMQ 与 Kafka 的技术差异以及使用注意点
生活随笔
收集整理的這篇文章主要介紹了
kafka reassign 限速_RabbitMQ 与 Kafka 的技术差异以及使用注意点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
導言作為一個有豐富經驗的微服務系統架構師,經常有人問我,“應該選擇RabbitMQ還是Kafka?”。基于某些原因, 許多開發者會把這兩種技術當做等價的來看待。的確,在一些案例場景下選擇RabbitMQ還是Kafka沒什么差別,但是這兩種技術在底層實現方面是有許多差異的。不同的場景需要不同的解決方案,選錯一個方案能夠嚴重的影響你對軟件的設計,開發和維護的能力。第一篇文章介紹了RabbitMQ和Apache Kafka內部實現的相關概念。本篇文章會從兩個方面探討這兩種技術之間的差異,一個是這兩種技術之間的顯著差異,另一個是對于軟件架構師和開發者需要注意的差異。那么,我們先來說說架構模式,也就是我們嘗試著利用這兩種技術來實現的架構模式,并且評估什么時候該使用哪一個。注意 1如果你對RabbitMQ和Kafka的內部結構還不熟悉,我強烈推薦你閱讀我之前的第一篇文章。如果你不確定,那么可以簡要的看一下里面的標題和圖表,至少對這些差異有個大概的了解。注意 2上一篇文章發表之后,有些讀者問我對于Apache Pulsar的看法。Pulsar是另一種類型的消息系統,它旨在提供RabbitMQ和Kafka都有的一些優點。作為一個現代的消息系統,它看上去很有前途;但是像其他平臺系統一樣,都有各自的優缺點。這邊文章主要是比較RabbitMQ和Kafka,之后我會嘗試針對Apache Pulsar做一個比較。RabbitMQ和Kafka的顯著差異RabbitMQ是一個消息代理,但是Apache Kafka是一個分布式流式系統。好像從語義上就可以看出差異,但是它們內部的一些特性會影響到我們是否能夠很好的設計各種用例。例如,Kafka最適用于數據的流式處理,但是RabbitMQ對流式中的消息就很難保持它們的順序。另一方面,RabbitMQ內置重試邏輯和死信(dead-letter)交換器,但是Kafka只是把這些實現邏輯交給用戶來處理。這部分主要強調在不同系統之間它們的主要差異。消息順序對于發送到隊列或者交換器上的消息,RabbitMQ不保證它們的順序。盡管消費者按照順序處理生產者發來的消息看上去很符合邏輯,但是這有很大誤導性。RabbitMQ文檔中有關于消息順序保證的說明:“發布到一個通道(channel)上的消息,用一個交換器和一個隊列以及一個出口通道來傳遞,那么最終會按照它們發送的順序接收到。”?——RabbitMQ代理語義(Broker Semantics)換話句話說,只要我們是單個消費者,那么接收到的消息就是有序的。然而,一旦有多個消費者從同一個隊列中讀取消息,那么消息的處理順序就沒法保證了。由于消費者讀取消息之后可能會把消息放回(或者重傳)到隊列中(例如,處理失敗的情況),這樣就會導致消息的順序無法保證。一旦一個消息被重新放回隊列,另一個消費者可以繼續處理它,即使這個消費者已經處理到了放回消息之后的消息。因此,消費者組處理消息是無序的,如下表所示。使用RabbitMQ丟失消息順序的例子當然,我們可以通過限制消費者的并發數等于1來保證RabbitMQ中的消息有序性。更準確點說,限制單個消費者中的線程數為1,因為任何的并行消息處理都會導致無序問題。不過,隨著系統規模增長,單線程消費者模式會嚴重影響消息處理能力。所以,我們不要輕易的選擇這種方案。另一方面,對于Kafka來說,它在消息處理方面提供了可靠的順序保證。Kafka能夠保證發送到相同主題分區的所有消息都能夠按照順序處理。回顧第一篇文章介紹,默認情況下,Kafka會使用循環分區器(round-robin partitioner)把消息放到相應的分區上。不過,生產者可以給每個消息設置分區鍵(key)來創建數據邏輯流(比如來自同一個設備的消息,或者屬于同一租戶的消息)。所有來自相同流的消息都會被放到相同的分區中,這樣消費者組就可以按照順序處理它們。但是,我們也應該注意到,在同一個消費者組中,每個分區都是由一個消費者的一個線程來處理。結果就是我們沒法伸縮(scale)單個分區的處理能力。不過,在Kafka中,我們可以伸縮一個主題中的分區數量,這樣可以讓每個分區分擔更少的消息,然后增加更多的消費者來處理額外的分區。獲勝者(Winner):顯而易見,Kafka是獲勝者,因為它可以保證按順序處理消息。RabbitMQ在這塊就相對比較弱。消息路由RabbitMQ可以基于定義的訂閱者路由規則路由消息給一個消息交換器上的訂閱者。一個主題交換器可以通過一個叫做routing_key的特定頭來路由消息。或者,一個頭部(headers)交換器可以基于任意的消息頭來路由消息。這兩種交換器都能夠有效地讓消費者設置他們感興趣的消息類型,因此可以給解決方案架構師提供很好的靈活性。另一方面,Kafka在處理消息之前是不允許消費者過濾一個主題中的消息。一個訂閱的消費者在沒有異常情況下會接受一個分區中的所有消息。作為一個開發者,你可能使用Kafka流式作業(job),它會從主題中讀取消息,然后過濾,最后再把過濾的消息推送到另一個消費者可以訂閱的主題。但是,這需要更多的工作量和維護,并且還涉及到更多的移動操作。獲勝者:在消息路由和過濾方面,RabbitMQ提供了更好的支持。消息時序(timing)在測定發送到一個隊列的消息時間方面,RabbitMQ提供了多種能力:消息存活時間(TTL)發送到RabbitMQ的每條消息都可以關聯一個TTL屬性。發布者可以直接設置TTL或者根據隊列的策略來設置。系統可以根據設置的TTL來限制消息的有效期。如果消費者在預期時間內沒有處理該消息,那么這條消息會自動的從隊列上被移除(并且會被移到死信交換器上,同時在這之后的消息都會這樣處理)。TTL對于那些有時效性的命令特別有用,因為一段時間內沒有處理的話,這些命令就沒有什么意義了。延遲/預定的消息RabbitMQ可以通過插件的方式來支持延遲或者預定的消息。當這個插件在消息交換器上啟用的時候,生產者可以發送消息到RabbitMQ上,然后這個生產者可以延遲RabbitMQ路由這個消息到消費者隊列的時間。這個功能允許開發者調度將來(future)的命令,也就是在那之前不應該被處理的命令。例如,當生產者遇到限流規則時,我們可能會把這些特定的命令延遲到之后的一個時間執行。Kafka沒有提供這些功能。它在消息到達的時候就把它們寫入分區中,這樣消費者就可以立即獲取到消息去處理。Kafka也沒用為消息提供TTL的機制,不過我們可以在應用層實現。不過,我們必須要記住的一點是Kafka分區是一種追加模式的事務日志。所以,它是不能處理消息時間(或者分區中的位置)。獲勝者:毫無疑問,RabbitMQ是獲勝者,因為這種實現天然的就限制Kafka。消息留存(retention)當消費者成功消費消息之后,RabbitMQ就會把對應的消息從存儲中刪除。這種行為沒法修改。它幾乎是所有消息代理設計的必備部分。相反,Kafka會給每個主題配置超時時間,只要沒有達到超時時間的消息都會保留下來。在消息留存方面,Kafka僅僅把它當做消息日志來看待,并不關心消費者的消費狀態。消費者可以不限次數的消費每條消息,并且他們可以操作分區偏移來“及時”往返的處理這些消息。Kafka會周期的檢查分區中消息的留存時間,一旦消息超過設定保留的時長,就會被刪除。Kafka的性能不依賴于存儲大小。所以,理論上,它存儲消息幾乎不會影響性能(只要你的節點有足夠多的空間保存這些分區)。獲勝者:Kafka設計之初就是保存消息的,但是RabbitMQ并不是。所以這塊沒有可比性,Kafka是獲勝者。容錯處理當處理消息,隊列和事件時,開發者常常認為消息處理總是成功的。畢竟,生產者把每條消息放入隊列或者主題后,即使消費者處理消息失敗了,它僅僅需要做的就是重新嘗試,直到成功為止。盡管表面上看這種方法是沒錯的,但是我們應該對這種處理方式多思考一下。首先我們應該承認,在某些場景下,消息處理會失敗。所以,即使在解決方案部分需要人為干預的情況下,我們也要妥善地處理這些情況。消息處理存在兩種可能的故障: 優先選擇Kafka的條件: 大部分情況下這兩個消息平臺都可以滿足我們的要求。但是,它取決于我們的架構師,他們會選擇最合適的工具。當做決策的時候,我們需要考慮上面著重強調的功能性差異和非功能性限制。這些限制如下: 當開發復雜的軟件系統時,我們可能被誘導使用同一個消息平臺去實現所有必須的消息用例。但是,從我的經驗看,通常同時使用這兩個消息平臺能夠帶來更多的好處。例如,在一個事件驅動的架構系統中,我們可以使用RabbitMQ在服務之間發送命令,并且使用Kafka實現業務事件通知。原因是事件通知常常用于事件溯源,批量操作(ETL風格),或者審計目的,因此Kafka的消息留存能力就顯得很有價值。相反,命令一般需要在消費者端做額外處理,并且處理可以失敗,所以需要高級的容錯處理能力。這里,RabbitMQ在功能上有很多閃光點。以后我可能會寫一篇詳細的文章來介紹,但是你必須記住--你的里程(mileage)可能會變化,因為適合性取決于你的特定需求。總結思想寫這兩篇文章是由于我觀察到許多開發者把這RabbitMQ和Kafka作為等價來看待。我希望通過這兩篇文章的幫助能夠讓你獲得對這兩種技術實現的深刻理解以及它們之間的技術差異。反過來通過它們之間的差異來影響這兩個平臺去給用例提供更好的服務。這兩個消息平臺都很棒,并且都能夠給多個用例提供很好的服務。但是,作為解決方案架構師,取決于我們對每一個用例需求的理解,以及優化,然后選擇最合適的解決方案。相關鏈接: 原文鏈接:https://medium.com/better-programming/rabbitmq-vs-kafka-1779b5b70c41文章來源:分布式實驗室,點擊查看原文。▼往期精彩回顧▼Delayed Message 插件實現 RabbitMQ 延遲隊列利用 RabbitMQ 死信隊列和 TTL 實現定時任務高并發場景下 RabbitMQ 消費端服務限流實踐圖文實踐 RabbitMQ 不同類型交換機消息投遞機制一次 RabbitMQ 生產故障引發的服務重連限流思考RabbitMQ 和 Kafka 的比較
與50位技術專家面對面20年技術見證,附贈技術全景圖
瞬時故障——故障產生是由于臨時問題導致,比如網絡連接,CPU負載,或者服務崩潰。我們可以通過一遍又一遍的嘗試來減輕這種故障。
持久故障——故障產生是由于永久的問題導致的,并且這種問題不能通過額外的重試來解決。比如常見的原因有軟件bug或者無效的消息格式(例如,損壞(poison)的消息)
高級靈活的路由規則
消息時序控制(控制消息過期或者消息延遲)
高級的容錯處理能力,在消費者更有可能處理消息不成功的情景中(瞬時或者持久)
更簡單的消費者實現
嚴格的消息順序
延長消息留存時間,包括過去消息重放的可能
傳統解決方案無法滿足的高伸縮能力
當前開發者對這兩個消息平臺的了解
托管云解決方案的可用性(如果適用)
每種解決方案的運營成本
適用于我們目標棧的SDK的可用性
https://engineering.nanit.com/rabbitmq-retries-the-full-story-ca4cc6c5b493
https://content.pivotal.io/blog/rabbitmq-hits-one-million-messages-per-second-on-google-compute-engine
總結
以上是生活随笔為你收集整理的kafka reassign 限速_RabbitMQ 与 Kafka 的技术差异以及使用注意点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辽宁舰年龄已是三十多岁,那还能服役多久
- 下一篇: 台式电脑不拉网线上网_技巧知识:电脑不用