您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

01 消息訂閱與發布kafka(kafka——消費者原理解析)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-05-31 20:13:40【】7人已围观

简介消息隊列中點對點與發布訂閱區別JMS規范支持兩種消息模型:點對點(pointtopoint,queue)和發布/訂閱(publish/subscribe,topic)。1.點對點生產者生產消息發送到q

消息隊列中點對點與發布訂閱區別

JMS規范支持兩種消息模型:點對點(point to point, queue)和發布/訂閱(publish/subscribe,topic)。

1. 點對點

生產者生產消息發送到queue中,然后消費者從queue中取出并且消費消息。這里要注意:

消息被消費以后,queue中不再有存儲,所以消費者不可能消費到已經被消費的消息。

Queue支持存在多個消費者,但是對一個消息而言,只會有一個消費者可以消費。

2. 發布/訂閱

生產者將消息發布到topic中,同時有多個消費者訂閱該消息。和點對點方式不同,發布到topic的消息會被所有訂閱者消費。

小結

queue實現了負載均衡,一條消息只能被一個消費者接收,當沒有消費者可用時,這個消息會被保存直到有一個可用的消費者,一個queue可以有很多消費者,他們之間實現了負載均衡, 所以Queue實現了一個可靠的負載均衡。 topic實現了發布和訂閱,當你發布一個消息,所有訂閱這個topic的服務都能得到這個消息,所以從1到N個訂閱者都能得到一個消息的拷貝

疑問

發布訂閱模式下,能否實現訂閱者負載均衡消費呢?當發布者消息量很大時,顯然單個訂閱者的處理能力是不足的。實際上現實場景中是多個訂閱者節點組成一個訂閱組負載均衡消費topic消息即分組訂閱,

這樣訂閱者很容易實現消費能力線性擴展。

傳統企業型消息隊列ActiveMQ遵循了JMS規范,實現了點對點和發布訂閱模型,但其他流行的消息隊列RabbitMQ、Kafka并沒有遵循老態龍鐘的JMS規范,是通過什么方式實現消費負載均衡、多訂閱呢?

RabbitMQ實現了AQMP協議,AQMP協議定義了消息路由規則和方式。生產端通過路由規則發送消息到不同queue,消費端根據queue名稱消費消息。此外RabbitMQ是向消費端推送消息,訂閱關系和消費狀態保存在服務端。

生產端發送一條消息通過路由投遞到Queue,只有一個消費者能消費到。

當RabbitMQ需要支持多訂閱時,發布者發送的消息通過路由同時寫到多個Queue,不同訂閱組消費此消息。

RabbitMQ既支持內存隊列也支持持久化隊列,消費端為推模型,消費狀態和訂閱關系由服務端負責維護,消息消費完后立即刪除,不保留歷史消息。所以支持多訂閱時,消息會多個拷貝。

Kafka只支持消息持久化,消費端為拉模型,消費狀態和訂閱關系由客戶端端負責維護,消息消費完后不會立即刪除,會保留歷史消息。因此支持多訂閱時,消息只會存儲一份就可以了。

同一個訂閱組會消費topic所有消息,每條消息只會被同一個訂閱組的一個消費節點消費,同一個訂閱組內不同消費節點會消費不同消息

轉自: 買粉絲s://blog.csdn.買粉絲/litao/article/details/47723105

kafka入門:一個開源的、輕量級、高吞吐、高可用的分布式消息系統

隨著信息技術的快速發展及互聯網用戶規模的急劇增長,計算機所存儲的信息量正呈爆炸式增長,目前數據量已進入大規模和超大規模的海量數據時代, 如何高效地存儲、分析、處理和挖掘海量數據 已成為技術研究領域的熱點和難點問題。而 如何采集和運營管理、分析這些數據 也是大數據處理中一個至關重要的組成環節,這就需要相應的基礎設施對其提供支持。針對這個需求,當前業界已有很多開源的消息系統應運而生,kafka就是一款當然非常流行的消息系統。

Kafka是一款開源的、輕量級的、分布式、可分區和具有復制備份的(Replicated)、基于ZooKeeper協調管理的分布式流平臺的功能強大的消息系統。作為一個流式處理平臺,必須具備以下3個關鍵特性:

1) 能夠允許發布和訂閱流數據。

2) 存儲流數據時提供相應的容錯機制。

3) 當流數據到達時能夠被及時處理。

消息流系統kafka的基本結構包括生產者和消費者,以及kafka集群。

生產者負責生產消息,將消息寫入Kafka集群;消費者從Kafka集群中拉取消息。

消息是Kafka通信的基本單位 ,由一個 固定長度的消息頭 和一個 可變長度的消息體 構成。

Kafka將 一組消息 抽象歸納為一個主題(Topic),也就是說,一個主題是對消息的一個分類。 生產者將消息指定主題發送到kafka集群,消費者訂閱主題或主題的某些分區進行消費。

Kafka將一組消息歸納為一個主題,而 每個主題又被分成一個或多個分區(Partition) 。每個分區由一系列有序、不可變的消息組成,是一個有序隊列。 每個分區在物理上對應為一個文件夾 ,分區的命名規則為主題名稱后接“—”連接符,之后再接分區編號,分區編號從0開始,編號最大值為分區的總數減1。

分區使得Kafka在并發處理上變得更加容易,理論上來說,分區數越多吞吐量越高,但這要根據集群實際環境及業務場景而定。同時,分區也是Kafka保證消息被順序消費以及對消息進行負載均衡的基礎。

疑問和答案 :分區如何保證消息被順序消費?每個分區內的消息是有序的,但不同分區間如何保證?猜測是分區從存儲空間上比較大,分區個數少。順序消費的主要因素在分區內的消息,分區間的可以忽略。高吞吐率順序寫磁盤估計也是這個原因。

Kafka只能保證一個分區之內消息的有序性,并不能保證跨分區消息的有序性。 每條消息被追加到相應的分區中,是順序寫磁盤,因此效率非常高,這是Kafka高吞吐率的一個重要保證 。同時與傳統消息系統不同的是,Kafka并不會立即刪除已被消費的消息,由于磁盤的限制消息也不會一直被存儲,因此 Kafka提供兩種刪除老數據的策略 ,一是基于消息已存儲的時間長度,二是基于分區的大小。這兩種策略都能通過配置文件進行配置。

每個分區又有一至多個副本(Replica),分區的副本分布在集群的不同代理上,以提高可用性。

從存儲角度上分析,分區的每個副本在邏輯上抽象為一個日志(Log)對象,即分區的副本與日志對象是一一對應的。每個主題對應的 分區數 可以在Kafka啟動時所加載的配置文件中配置,也可以在創建主題時指定。當然,客戶端還可以在主題創建后修改主題的分區數。

為什么副本要分Leader和Follower? 如果沒有Leader副本,就需要所有的副本都同時負責讀/寫請求處理,同時還得保證這些副本之間數據的一致性,假設有n個副本則需要有n×n條通路來同步數據,這樣數據的一致性和有序性就很難保證。

為解決這個問題,Kafka選擇分區的一個副本為Leader,該分區其他副本為Follower,只有 Leader副本 才負責處理客戶端 讀/寫請求 ,Follower副本從Leader副本同步數據。

引入Leader副本后客戶端只需與Leader副本進行交互,這樣數據一致性及順序性就有了保證。Follower副本從Leader副本同步消息,對于n個副本只需n-1條通路即可,這樣就使得系統更加簡單而高效。

副本Follower與Leader的角色并不是固定不變的,如果Leader失效,通過相應的選舉算法將從其他Follower副本中選出新的Leader副本。

疑問 :leader副本和follower副本是如何選出來的?通過zookeeper選舉的嘛?

Kafka在ZooKeeper中動態維護了一個 ISR(In-sync Replica) ,即保存同步的副本列表,該列表中保存的是與Leader副本保持消息同步的所有副本對應的代理節點id。 如果一個Follower副本宕機或是落后太多 ,則該Follower副本節點將 從ISR列表中移除 。 本書用宕機 來特指某個代理失效的情景,包括但不限于代理被關閉,如代理被人為關閉或是發生物理故障、心跳檢測過期、網絡延遲、進程崩潰等。

任何發布到分區的消息會被直接追加到日志文件的尾部(分區目錄下以“.log”為文件名后綴的數據文件),而每條 消息 在日志文件中的位置都會對應一個按序遞增的 偏移量 。偏移量是一個分區下嚴格有序的 邏輯值 ,它并不表示消息在磁盤上的物理位置。由于Kafka幾乎不允許對消息進行隨機讀寫,因此Kafka并沒有提供額外索引機制到存儲偏移量。

消費者可以通過控制消息偏移量來對消息進行消費 ,如消費者可以指定消費的起始偏移量。 為了保證消息被順序消費,消費者已消費的消息對應的偏移量也需要保存 。需要說明的是,消費者對消息偏移量的操作并不會影響消息本身的偏移量。舊版消費者將消費偏移量保存到ZooKeeper當中, 而新版消費者是將消費偏移量保存到Kafka內部一個主題當中。 當然,消費者也可以自己在外部系統保存消費偏移量,而無需保存到Kafka中。

推測 :一個主題有多個分區,一個分區有多個副本。一個主題(一類消息)有多個分區(消息被分段),一個分區(每段消息)有多個副本(每段消息的副本數)。消息一旦發給kafka,就會分配一個偏移量,在多個副本中的偏移量是一樣的。這樣的話,消費者通過偏移量消費時對于多個副本就沒有差異性。

Kafka集群由一個或多個Kafka實例構成,每一個Kafka實例稱為代理(Broker),通常也稱代理為Kafka服務器(KafkaServer)。在生產環境中Kafka集群一般包括一臺或多臺服務器,我們可以在一臺服務器上配置一個或多個代理。 每一個代理都有唯一的標識id,這個id是一個非負整數 。在一個Kafka集群中,每增加一個代理就需要為這個代理配置一個與該集群中其他代理不同的id, id值可以選擇任意非負整數即可,只要保證它在整個Kafka集群中唯一,這個id就是代理的名字,也就是在啟動代理時配置的broker.id對應的值。

生產者(Procer)負責將消息發送給代理,也就是向Kafka代理發送消息的客戶端。

消費者(Comsumer)以拉取(pull)方式拉取數據,它是消費的客戶端。在Kafka中 每一個消費者都屬于一個特定消費組 (ConsumerGroup),可以為每個消費者指定一個消費組,以groupId代表消費組名稱,通過group.id配置設置。 如果不指定消費組 ,則該消費者屬于默認消費組test-買粉絲nsumer-group。

每個消費者有一個全局唯一的id ,通過配置項client.id指定,

很赞哦!(3726)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:黑龙江省伊春金山屯区

工作室:小组

Email:[email protected]