kafka是目前市場上比較流行的訊息框架。本篇文章盡力去詮釋kafka模型背後的設計原理,從而更加深刻的理解kafka,在使用過程中盡可能少的入坑。
三個角色:
producer:生產者。負責傳送訊息到kafka集群
broker:kafka集群。負責儲存訊息
consumer:消費者。負責消費kafka集群的訊息
模型:
topic:乙個topic即乙個邏輯上的主題,生產者可以生產訊息到該主題,消費者則從該主題下消費訊息。對於生產者和消費者而言,並不需要關心某個topic是怎麼存的,存在哪台機器這些物理資訊。
partition:partition是物理上的,每個topic可以有多個partition。這裡引出乙個問題,對於外界而言,乙個topic已經足夠,為什麼還要設計partition這個模型?
這是因為,利用partition可以做水平擴張,負載均衡。假設乙個topic訊息量巨大,單機支撐這個topic就會出現io瓶頸,如果要想法去掉這個瓶頸,最簡單能想到的就是將乙個topic分散在多台機器,用多台機器來分散io。所以partition的目的就是將同乙個topic分散到不同機器上,從而實現水平擴充套件的利器。
借用知乎上的乙個例子:
kafka正是借用生活中的例子來設計的topic和partition。其中,不同的topic就是不同的高速公路,partition就是某條高速公路上面的車道,如果車流量大,則拓寬車道,反之,減少車道;而消費者就好比收費站,收費站越多,則通過速度越快。
consumer group:consumer group實際上就是一組consumer的集合。它的出現是基於兩個需求。一,在應用消費kafka訊息時,希望不會重複消費。二,有時應用需要並行消費。對於這兩個看似矛盾的需求,kafka通過引入consumer group來解決了。
partition和consumer group之間的關係:partition的設計初衷是通過增加partition讓consumer能夠併發消費,但是kafka的設計是在同乙個partition上不允許併發,因此,如果consumer group中的consumer執行緒數量比partition多,則有的執行緒將得不到訊息;反之,如果consumer執行緒數量比partition少,則有的執行緒將會收到多個訊息,多個partition間的訊息並不能保證順序,只有同乙個partition上的資料是有序的。
訊息順序:
如果topic中僅分配了乙個partition,kafka能夠保證訊息的順序投遞,並且由於同乙個consumer group只有乙個consumer,在消費時也能保證訊息的順序,實際上就是序列的處理訊息。而如果想要保證訊息的處理順序又想要並行化的進行訊息投遞處理,就不得不自行在consumer端處理。當然,還有個辦法,即因為可以保證區域性partition訊息的順序性,只要將需要保持順序的訊息通過特定的hash編碼放到特定的partition中,則該組partition訊息即可保證順序訪問。
訊息佇列需要解決的幾個難題:
1. 訊息的順序性
2. 訊息的重複性
3. 事務訊息
(待續)
kafka與unix管道
kafka是個奇葩!
kafka——分布式發布訂閱訊息系統
kafka入門介紹
kafka設計原理介紹
kafka 指南
kafka史上最詳細原理總結
apache kafka技術分享系列(目錄索引)
阿里rocketmq如何解決訊息的順序&重複兩大硬傷?
如何做到「恰好一次」地傳遞數十億條訊息
Kafka的儲存模型
有部分內容 這篇講的很詳細 易懂 kafka乙個topic可以有多個partition,多個執行緒,每個執行緒負責乙個partition進行讀寫 每個paratition可以有多個logsegment,每個logsegment檔案包括乙個日誌資料檔案和兩個索引檔案 偏移量索引檔案和訊息時間戳索引檔案...
Kafka訊息模型
一 訊息傳遞模型 傳統的訊息佇列最少提供兩種訊息模型,一種p2p,一種pub sub,而kafka並沒有這麼做,巧妙的,它提供了乙個消費者組的概念,乙個訊息可以被多個消費者組消費,但是只能被乙個消費者組裡的乙個消費者消費,這樣當只有乙個消費者組時就等同與p2p模型,當存在多個消費者組時就是pub s...
kafka 事務模型
kafka 在 0.11.0.0 版本中新增了事務支援,同時增加了 精確一次 的傳送語義用於支援事務模型 exactly once,this is what people actually want,each message is delivered once and only once 簡單的解釋...