kafka與rabbitmq訊息中介軟體

2021-09-28 11:42:48 字數 3509 閱讀 6487

kafka與rabbitmq

xmind 思維導圖

axure 原型設計

一:rabbitmq集群:

1.1普通集群

rabbitmq 每個節點上有乙個broker,每個broker負責本機上佇列的維護,並且borker之間可以互相通訊。集群中有兩個佇列a和b,每個佇列都分為master queue和mirror queue(備份)

乙個主多個備,只有主做接受和傳送,備就是乙個映象,不承擔壓力,用在失敗後成為主(為什麼備不承擔壓力,應該是為了資料一致性吧)

例子:機器1 佇列a,佇列b b-master a-mirrow(在此消費a佇列,需要從機器2上讀取到機器1,在給消費者)

機器2 對列a 對列b a-mster b-mirrow

1.2映象集群

可以指定某個佇列在多個節點上 儲存,而不需要在拉取的時候在多個節點上傳遞資料

二:kafka集群 只有lead partition 才提供讀寫

kafka 多個master 也就是多個partition,並且這多個partitionr之間的資料沒有交集(rabbit的主也沒有交集)

乙個佇列有多個主partition,每個主partition又有若干副partition做備份,同步機制類似於rabbitmq。

1個partition只能被同組的乙個consumer消費,同組的consumer則起到均衡效果

rabbitmq每個佇列只能有乙個master,即master queue單節點

kafka乙個佇列可以有多個master(partition)(併發高原因),也就是說同乙個佇列可以發往任何乙個partition,多個partition沒有交集

每個分割槽的offset是有序的,多個分割槽之間無序

順序性:

多個消費者 不能保證順序,乙個會保證的,kafka由於partition機制,乙個partition可以一直對應乙個客戶端,根據訊息傳送的key生產者可以固定partition

如果消費者是多執行緒的話,可以放到乙個全域性佇列裡面

乙個topic 可以有多個partition,乙個消費組裡可以有多個消費者,乙個消費組內的消費組不能收到重複的topic,負載均衡,

乙個消費者只能在乙個partition上消費,即如果消費者大於partition數量的話,有乙個消費者是空閒的

乙個消費組有乙個offset

kafka只保證按乙個partition中的順序將訊息發給consumer,不保證乙個topic的整體(多個partition間)的順序。

消費者從哪個分割槽上取資料是固定的,(如果不改變分割槽數和消費者數的話)

在多個消費者,或者單個消費多個執行緒的時候,都不保證順序的

最終要讓訊息有序,就要保證消費者唯一。

rabbitmq :乙個佇列對應乙個消費者

kafka:同乙個key,發到到同乙個partition

rabbitmq本身是基於erlang編寫的,erlang天生支援分布式(通過同步erlang集群各節點的cookie來實現),因此不需要像kafka那樣通過zookeeper來實現分布式集群(維護生產者和消費者轉台)

可靠性: 效率最高是發完啥也不管了,都有同步和非同步的。

rabbit

生產者:通過事務(channel.txselect)或者生產者confirm模(實際也是ack),有同步和非同步的confirm,非同步(監聽)效能高 channel.addconfirmlistener

消費者:ack,broker收到後立刻刪除(效率低乙個原因)

broker:持久化

先是記憶體,滿了磁碟

kafka

生產者:kafka的ack機制 request.required.acks

=0 直接返回。

=1 leader確認訊息存後再返回,保證至少一次語義

=all leader和isr中所有replica都確認訊息再返回,保證至少一次語義

消費者:	1.讀取訊息 -> 提交offset -> 處理訊息   	2.讀取訊息 -> 處理訊息 -> 提交offset 。 commit offset 和業務操作弄成乙個事務

broker:返回ack的時機 request.required.acks=0 直接返回 =1 leader確認訊息存下來了,再返回,保證至少一次語義 =all leader和isr中所有replica都確認訊息存下來了,再返回,保證至少一次語義

一直是磁碟

提交offset:

自動通過auto.commit.interval.ms指定時間間隔,可能會丟資料,因為自動提交了,

但是客戶端處理失敗了,就會丟失,解決辦法是客戶端如果失敗的話在catch 裡儲存資訊,通過乙個定時任務重試,直到成功。

手動 分同步和非同步,同步會重試,非同步不會重試

databus mysql通過binlog,實現快取等等。

消費者在消費完訊息後傳送乙個回執給rabbitmq,rabbitmq收到訊息回執(message acknowledgment)後才將該訊息從queue中移除;

而kafka是通過客戶端更新offset來實現的。可以自動實現,也可以客戶端通過**實現

kafka的consumer的offset儲存:

一種是存放在broker的日誌目錄中,另一種方式是存放在zookeeper中。兩種存放方式和你使用kafka-console-consumer命令使用的選項有關。如果使用的是bootstrap-server,那麼就存放在broker;如果使用的是–zookeeper那麼就存放在zookeeper。

訊息被處理的狀態是在consumer端維護 注意是維護 不是儲存

offset是代表某個分割槽被某個組目前消費的位置,

比如 p1 group1 10

比如說,p1裡面有來了一些資料,那p1的資料位置 15

消費者用 p1 group1 10和 15一比較,就可以得到 10~15的資料

乙個topic可以給多個分割槽訊息,多個分割槽不會重複資料

乙個broke上可以有多個分割槽,多個分割槽有乙個lead

同乙個消費組內的消費者要小於分割槽數,不然會有消費者永遠 收不到資料

基於replicated方案,那麼就意味著需要對多個備份進行排程;每個partition都有乙個server為"leader";leader負責所有的讀寫操作,如果leader失效,那麼將會有其他follower來接管(成為新的leader);follower只是單調的和leader跟進,同步訊息即可…由此可見作為leader的server承載了全部的請求壓力,因此從集群的整體考慮,有多少個partitions就意味著有多少個"leader",kafka會將"leader"均衡的分散在每個例項上,來確保整體的效能穩定.

producers

producer將訊息發布到指定的topic中,同時producer也能決定將此訊息歸屬於哪個partition;比如基於"round-robin"方式或者通過其他的一些演算法等.

key指定

redis 分片集群 主寫從讀,只在從配置就好(從拉取的方式),通過rdb傳送給從快照,需要哨兵

集群不同的分片上不同key。redis 3.0以後才有分片集群

缺點 多個key的操作不支援

kafka資料檢索 Kafka日誌分段與訊息查詢

kafka作為乙個訊息中介軟體 後面kafka逐漸轉向乙個流失處理平台kafkastream 訊息最終的儲存都落在日誌中。kafka的訊息最終傳送是以topic下的分割槽為最終目標的,因此kafka的日誌儲存也是以分割槽為單位。配置檔案中log.dir引數決定了kafka資料檔案的存放目錄,該引數可...

kafka 檢視待消費資料 kafka檢視消費資料

kafka檢視消費資料 一 如何檢視 在老版本中,使用kafka run class.sh 指令碼進行檢視。但是對於最新版本,kafka run class.sh 已經不能使用,必須使用另外乙個指令碼才行,它就是kafka consumer groups.sh 普通版檢視所有組 要想查詢消費資料,必...

kafka 檢視待消費資料 kafka檢視消費資料

一 如何檢視 在老版本中,使用kafka run class.sh 指令碼進行檢視。但是對於最新版本,kafka run class.sh 已經不能使用,必須使用另外乙個指令碼才行,它就是kafka consumer groups.sh 普通版檢視所有組 要想查詢消費資料,必須要指定組。那麼線上執行...