訊息系統 kafka之一 系統簡介

2021-08-17 06:01:35 字數 3420 閱讀 8105

最近在研究訊息中介軟體kafka,下面簡單介紹一下kafka訊息系統,首先,為什麼使用訊息中介軟體,有哪些訊息中介軟體,為什麼選擇kafka

1.首先就是訊息系統的高效能,即使是非常普通的硬體可以支撐一秒幾十萬的訊息

2.訊息佇列對應用之間進行了解耦,應用之間不存在強依賴

3.訊息佇列可以對訊息資料進行持久化,這樣即使處理訊息的程序全部掛掉,也不會丟失已經加入訊息佇列的資料,對很多關鍵的業務來說,規避資料丟失的風險是至關重要的

4.由於訊息佇列對應用之間進行了解耦,這也大大的增加了系統的可擴充套件性,從訊息的產出和訊息的消費

5.應對突發高併發流量,在訪問量劇增的情況下,使用訊息佇列把請求進行緩衝和篩選,防止突發流量衝擊後端介面,導致應用超時或是直接拒絕服務

6.使用訊息佇列可以在一定程度上保證資料的順序性

現在比較流行的mq有:activemq,kafka,rabbitmq,redis,jafka,zeromq

值得一提的是redis作為基於key-value的nosql資料庫,也可以作訊息佇列,並且完全可以作為乙個輕量級的佇列伺服器來使用;除此之外,amq,rabbitmq,zeromq都是相對比較重量級的訊息系統,尤其是zeromq,雖然稱作是最快的訊息佇列系統,但是複雜的配置和技術框架讓很多開發者望而卻步;然而kafka和jafka,作為乙個高效能跨語言分布式發布/訂閱訊息佇列系統,在具有以上訊息系統的所有優點之外,在量級上相對於amq之類來說也是非常輕量級的。

kafka的優勢如下:

1.可靠性,kafka的partition機制和replication機制,容錯機制使訊息的傳遞有著很高的可靠性

2.kafka支援集群規模的熱擴充套件

3.kafka的高效能,在資料的發布和訂閱過程中,都能夠保證資料的高吞吐量,即使在tb的資料儲存情況下,仍然表現出很好的穩定性

4.kafka的訊息狀態由consumer處理,可以根據重設offset實現訊息的重複消費(這個也是我在做任務排程的時候,選擇kafka的原因)

kafka可以實現兩種型別的訊息傳遞:點對點(單播),和訂閱/發布(廣播)

點對點:看字面意思,就是訊息由乙個點傳遞到另乙個點,也確實是這樣子的,訊息生產者生產訊息並且傳送到queue中,然後消費者從佇列中取出訊息進行消費,但是需要注意的是,queue雖然有可能存在多個消費者,但是對於乙個訊息,只能被乙個消費者消費到。

訂閱/發布:這個更好理解了,就像散布訊息那樣,訊息生產者把訊息發布到topic,如果同時有多個消費者訂閱了該訊息,那麼發布到topic的訊息會被所有的訂閱的消費者消費

首先先來看下kafka的系統架構,然後再來解釋一下kafka是如何實現這兩種訊息傳遞模式的。

從上圖看到,乙個典型的kafka集群中包含若干個producer(可以是前端的pageview ,或者是是伺服器日誌,系統cpu,memory等),若干的broker(kafka支援水平擴充套件,一般broker數量越多,集群吞吐量越高),若干的consumer group,以及乙個zookeeper集群。kafka通過zookeeper管理集群配置,選舉leader,以及在consumer group發生改變時進行rebalance,producer使用push模式將訊息發布到broker,consumer使用pull 模式從broker訂閱並消費訊息

下面介紹個系統中的各個角色:

producer:訊息的生產者,就是向kafka broker push訊息的客戶端

broker:就是 kafka伺服器,一台kafka伺服器就是乙個broker,乙個集群由多個broker組成,乙個broker可以容納多個 topic

topic & partition:

topic在邏輯上可以認為是乙個queue,每條消費都必須指定它的topic,可以簡單理解必須指明把這條訊息放到哪個queue裡面,為了使得kafka的吞吐量可以得到線性的提公升,物理機把topic分為了乙個或則是多個partition

在這裡有必要說一下 consumer group,根據consumer group的不同實現,可以實現訊息傳遞的單播還是廣播。

topic 可以有多個 consumer group,topic的訊息會在概念上覆制給所有的consumer group,但不是真正的複製 ,

如果 topic 中的訊息只傳送給乙個consumer group 那麼就是 點對點 單播模式,

如果topic中的訊息傳送給多個consumer group,那麼就是 發布/訂閱 廣播模式。

由於乙個 consumer group 只會把訊息發給consumer group中的一台 consumer (leader),所以,如果實現廣播的話可以實現 乙個topic 對應多個consumer group,但是乙個consumer group下面只有一台 consumer;

如果要實現 單播的話,那麼就是 乙個topic 對應乙個consumergroup ,乙個consumer group下面多個consumer;

kafka訊息系統裡面還有兩個名詞,乙個是partition 還有乙個是offset。

partition是對kafka乙個很好的擴充套件,提高了kafka的擴充套件性,如果乙個topic特別大的話,可以拆分成多個partition,然後分布到不同的broker上,這樣就相當於是,把乙個訊息佇列拆分成幾部分,然後這樣的話,broker被push這個topic的訊息的時候,就會儲存在分散在幾個broker的partition上,如果consumer去pull訊息的話 也會從這幾個分散的broker的partition去拉取。這種設計極大的提高kafka的吞吐量,試想如果是乙個特別大的topic的話,系統的i/o必將成為其瓶頸,使用partition對其進行拆分,提高了系統的效能。

同時還需要了解到 partition是乙個有序的佇列,partition的每條訊息都會被分配乙個有序的id,也就是下面說的offset,kafka 只能夠保證按照乙個partition中的訊息的順序去傳送訊息給consumer,不能保證整個的topic ,也就是多個partition之間的順序。

offset,kafka的儲存檔案都是以offset.kafka來命名的,如果您想要查詢位於2019位置,就只要找到2018.kafka就可以了,還有就是第乙個offset 就是00000000000.kafka。

這個offset是由consumer控制的,正常情況下consumer會在消費完一條訊息之後遞增該offset,當然consumer也可以將offset設定為乙個較小的值,這樣話可以進行重新消費訊息。因為offset是由consumer控制的,所以kafka broker是無狀態的,他不需要標記那些訊息消費國,也不需要通過broker去保證同乙個consumer group只有乙個consumer能訊息某一條訊息,因此就不需要鎖機制,這也為kafka的高吞吐率提供了保證。

以上是kafka的系統簡介,其中個人愚見如有誤還請指出,下面介紹下<>。

訊息系統 Kafka

kafka學習了資料庫裡面的設計,在裡面設計了topic 主題 這個東西類似於關係型資料庫的表 此時我需要獲取中國移動的資料,那就直接監聽topica即可。topic和partition像是hbase裡的table和region的概念,table只是乙個邏輯上的概念,真正儲存資料的是region,這...

kafka訊息系統

kafka 1.kafka是一種分布式 基於發布 訂閱的訊息系統。2.常用mq mesage queue 訊息佇列 rabbitmq activemq 這個青奧用過哦 kafka 3.producer 負責發布訊息到kafkabroker kafka伺服器 broker 訊息伺服器topic 伺服器...

業務系統設計之一 系統選單設計

很久沒寫文章了,前幾天有幾個朋友問了我很多關於業務系統 erp,drp,crm等 設計裡很多概念性東西,花了很長時間給他解釋,最後他門還是知其然不知其所以然,這對於剛跨出學校大門的朋友來說,理解起確實有點枯燥。這裡我以以前參與的用友erp,drp產品專案裡的部分設計為參考,通過幾篇文章來和大家分享業...