消息隊列分類
點對點
消息生產者生產消息發送到queue中,而後消息消費者從queue中取出而且消費消息。這裏要注意:緩存
- 消息被消費之後,queue中再也不有存儲,因此消息消費者不可能消費到已經被消費的消息。
- Queue支持存在多個消費者,可是對一個消息而言,只會有一個消費者能夠消費。
發佈/訂閱
消息生產者(發佈)將消息發佈到topic中,同時有多個消息消費者(訂閱)消費該消息。和點對點方式不一樣,發佈到topic的消息會被全部訂閱者消費。服務器
kafka介紹
kafka是一個分佈式的、分區的、多副本的、多訂閱者的日誌系統(分佈式消息隊列)。可同時支持點對點模式的消息隊列和發佈/訂閱模式的消息隊列。網絡
kafka架構說明
kafka角色術語:架構
- Broker:一臺kafka服務器就是一個broker。一個集羣由多個broker組成
- Topic:消息隊列,不一樣的消息會被髮送至不一樣的隊列當中
- Producer:消息生產者,就是向kafka broker發消息的客戶端
- Consumer:消息消費者,從kafka broker取消息的客戶端
- Consumer Group(CG):這是kafka用於實現一個topic消息廣播(發給全部的consumer)和單播(發給某一個consumer)的手段。一個topic能夠有多個CG,topic的每一條消息都會發送給每一個CG,但CG只會把消息發送給該CG中的一個consumer。若是須要實現廣播,只要將每一個consumer配置一個獨立的CG便可。而要實現單播則只要將全部的consumer放至同一個CG便可。用CG還能夠將consumer進行自由的分組而不須要producer屢次發送消息到不一樣的topic
- Partition:Partition是物理上的概念。爲了實現擴展性,一個很是大的topic能夠分佈到多個broker上,一個topic能夠分爲多個partition,每一個partition是一個有序的隊列。partition中的每條消息都會被分配一個有序的id(offset)。kafka只保證按一個partition的順序將消息發給consumer,不保證一個topic的總體順序
- Offset:kafka的存儲文件都是按照offset.kafka來命名,用offset作名字的好處是方便查找。例如你想找2049的位置,只要找到2048.kafka文件便可。第一個位置爲00000000000.kafka
kafka特性:併發
- 提供數據持久化,消息順序寫入磁盤,提高機械盤的讀寫性能
- 高吞吐量:即便是很是普通的硬件kafka也能夠支持每秒數十萬的消息
- 經過多副本的方式防止消息丟失
- 支持消息的同步和異步發送
- 消費狀態保存在客戶端
- 數據遷移、擴容對用戶透明
- 按期刪除機制,支持設定partitions的segment file保留時間。
kafka支持消息持久化存儲,持久化數據保存在kafka的日誌文件中,在生產者生產消息後,kafka不會直接把消息傳遞給消費者,而是先要在broker中進行存儲,爲了減小磁盤的寫入次數,broker會將消息暫時緩存起來,當消息的個數或尺寸、大小達到必定閾值時,再統一寫到磁盤上。經過這種方式以提升kafka的執行效率,並減小磁盤IO的調用次數。kafka中的每條消息寫到partition中,是順序寫入磁盤的,這可進一步保證寫入效率。異步
Topic與Partition的關係
Kafka中的topic是以partition的形式存放的,每一個topic均可以設置它的partition數量,推薦partition的數量要大於同時運行的consumer的數量,也建議partition的數量大於集羣broker的數量,這樣消息數據就能夠均勻的分佈在各個broker中。分佈式
在存儲結構上,每一個partition在物理上對應一個文件夾,該文件夾下存儲這個partition的全部消息和索引文件。parition命名規則爲topic名稱+序號,每個partition序號從0開始,序號最大值爲partitions數量減1。性能
每一個partition中有多個大小相等的segment數據文件,每一個segment的大小是相同的,但每一個消息的大小可能不一樣,所以segment數據文件中消息的數量可能不相等。segement數據文件有兩部分組成,分別爲index file和data file,此兩個文件是一一對應,對成出現,後綴分別爲".index"和".log"。日誌
每一個patition有本身的replica,每一個replica分佈在不一樣的broker節點上,多個partition須要選舉出leader partition,leader負責讀寫,並由zk負責fil over。
一個Topic配置多個patition能夠將消息內容分散存放到多個broker上,這樣就能夠避免文件尺寸達到單機磁盤的上限,同時還能夠保證消息存儲、消費的效率,由於更多的patitions能夠容納更多的consumer,可有效提高kafka的吞吐率。
partition複製機制
- 在kafka中,複製策略是基於partition,而不是topic。kafka將每一個partition數據複製到多個server上,任何一個partition有一個leader和0到多個follower,副本的數量能夠經過broker配置文件定義。
- leader處理全部的讀寫請求,follower須要與leader保持同步。Follower就像一個consumer,消費消息並保存至本地日誌中。leader負責跟蹤全部的follower狀態,若是follower落後太多或者失效,leader將會把它從同步列表中刪除。它會繼續從leader從獲取數據,直至數據足夠新,而後再次加入到同步列表當中。
- kafka不會更換replicas宿主,由於同步列表中的replicas須要足夠快,才能保證producer發佈消息時接受到ACK的延遲較小。
- 當全部follower都將一條消息保存成功,此消息才被認爲是"committed",那麼此時consumer才能消費它,這種同步策略要求follower和leader之間必須具備良好的網絡環境。
- 即便只有一個replica實例存活,仍然能夠保證消息的正常發送和接收,只要zk存活便可(這一點相較於其它分佈式存儲要求多數存活的方式不一樣)。
- 當leader失效時,須要在follower當中選取新的leader。kafka中leader的選舉並無採用多數投票的算法。由於這種算法對於網絡穩定性、投票者的數量等條件有要求。對於kafka而言,每一個partition中全部的replicas信息均可以在zk中得到,所以選取leader對它來說是一件很容易的事情。
Consumer與Topic的關係
kafka做爲分佈式的消息系統支持多個producer和多個consumer,producer能夠將消息分佈到集羣中不一樣節點的不一樣patition上,consumer也能夠消費多個節點上的多個patition。在寫消息時容許多個producer寫到同一個partition中,可是讀消息時,一個partition只容許被一個consumer group中的一個consumer所消費。而一個consumer能夠消費多個patition。也就是說同一個consumer group下的consumer對partition是互斥的,而不一樣consumer group之間則是共享的。
一般狀況下,一個group中會包含多個consumer,這樣不只能夠提升topic中消息的併發消費能力,並且還能提升"故障容錯"性,若是group中的某個consumer失效,那麼其消費的partitions將會有其餘consumer自動接管。而對於一個topic,同一個group中不能有多於partitions個數的consumer同時消費,不然將意味着某些consumer將沒法獲得消息