消息隊列kafka


 

消息隊列kafka

 

為什么用消息隊列

舉例

比如在一個企業里,技術老大接到boss的任務,技術老大把這個任務拆分成多個小任務,完成所有的小任務就算搞定整個任務了。
那么在執行這些小任務的時候,可能有一個環節很費時間,並且優先級很低,推遲完成也不影響整個任務運轉,那么技術老大就會將這個很費時間,且不重要的任務,丟給他的小弟去解決,自己繼續完成其他任務。

轉化為計算機思想

那個技術老大就是一個 程序系統,那個小弟就是消息隊列。
當程序系統發現某些任務耗費時間且優先級較低,遲點完成也不影響整個任務,就把這個任務丟給消息隊列。

場景

在程序系統中,例如外賣系統,訂單系統,庫存系統,優先級較高
發紅包,發郵件,發短信,app消息推送等任務優先級很低,很適合交給消息隊列去處理,以便於程序系統更快的處理其他請求。

消息隊列工作流程

消息隊列一般有三個角色:
隊列服務端
隊列生產者
隊列消費者
消息隊列工作流程就如同一個流水線,有產品加工,一個輸送帶,一個打包產品
輸送帶就是 不停運轉的消息隊列服務端
加工產品的就是 隊列生產者
在傳輸帶結尾打包產品的 就是隊列消費者

隊列產品

RabbitMQ
Erlang編寫的消息隊列產品,企業級消息隊列軟件,支持消息負載均衡,數據持久化等。

ZeroMQ 
saltstack軟件使用此消息,速度最快。

Redis
key-value的系統,也支持隊列數據結構,輕量級消息隊列

Kafka
由Scala編寫,目標是為處理實時數據提供一個統一、高通量、低等待的平台

一個app系統消息隊列工作流程

消費者,一個后台進程,不斷的去檢測消息隊列中是否有消息,有消息就取走,開啟新線程去處理業務,如果沒有一會再來

kafka是什么

在流式計算中,Kafka一般用來緩存數據,Storm通過消費Kafka的數據進行計算。

1)Apache Kafka是一個開源消息系統,由Scala寫成。是由Apache軟件基金會開發的一個開源消息系統項目。

2)Kafka最初是由LinkedIn公司開發,並於 2011年初開源。2012年10月從Apache Incubator畢業。該項目的目標是為處理實時數據提供一個統一、高通量、低等待的平台。

3)Kafka是一個分布式消息隊列。Kafka對消息保存時根據Topic進行歸類,發送消息者稱為Producer,消息接受者稱為Consumer,此外kafka集群有多個kafka實例組成,每個實例(server)成為broker。

4)無論是kafka集群,還是producer和consumer都依賴於zookeeper集群保存一些meta信息,來保證系統可用性。

消息通信圖


點對點模式(一對一,消費者主動拉取數據,輪詢機制,消息收到后消息清除,ack確認機制)

點對點模型通常是一個基於拉取或者輪詢的消息傳送模型,這種模型從隊列中請求信息,而不是將消息推送到客戶端。

這個模型的特點是發送到隊列的消息被一個且只有一個接收者接收處理,即使有多個消息監聽者也是如此。


發布/訂閱模式(一對多,數據生產后,推送給所有訂閱者)

發布訂閱模型則是一個基於推送的消息傳送模型。

發布訂閱模型可以有多種不同的訂閱者,臨時訂閱者只在主動監聽主題時才接收消息,而持久訂閱者則監聽主題的所有消息,即使當前訂閱者不可用,處於離線狀態。

消息隊列作用

1)程序解耦

允許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。

2)冗余:

消息隊列把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。

許多消息隊列所采用的"插入-獲取-刪除"范式中,在把一個消息從隊列中刪除之前,需要你的處理系統明確的指出該消息已經被處理完畢,從而確保你的數據被安全的保存直到你使用完畢。

3)峰值處理能力:

(大白話,就是本來公司業務只需要5台機器,但是臨時的秒殺活動,5台機器肯定受不了這個壓力,我們又不可能將整體服務器架構提升到10台,那在秒殺活動后,機器不就浪費了嗎?因此引入消息隊列)

在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見。

如果為以能處理這類峰值訪問為標准來投入資源隨時待命無疑是巨大的浪費。

使用消息隊列能夠使關鍵組件頂住突發的訪問壓力,而不會因為突發的超負荷的請求而完全崩潰。

4)可恢復性:

系統的一部分組件失效時,不會影響到整個系統。

消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復后被處理。

5)順序保證:

在大多使用場景下,數據處理的順序都很重要。

大部分消息隊列本來就是排序的,並且能保證數據會按照特定的順序來處理。(Kafka保證一個Partition內的消息的有序性)

6)緩沖:

有助於控制和優化數據流經過系統的速度,解決生產消息和消費消息的處理速度不一致的情況。

7)異步通信:

很多時候,用戶不想也不需要立即處理消息。比如發紅包,發短信等流程。

消息隊列提供了異步處理機制,允許用戶把一個消息放入隊列,但並不立即處理它。想向隊列中放入多少消息就放多少,然后在需要的時候再去處理它們。

應用

微信公眾號的訂閱
生產者寫入消息 -> kafka  -> 消費者

zookeeper會產生大量網絡io,zk所在節點,注意網絡監控

kafka角色

編輯,            生產消息,生產者
kafka集群,臨時緩存消息  queue隊列有kafka維護
消費者         定時/輪訓    方式去pull 消息

topic主題

同樣的消息類型,放入同一個topic,
例如微信有很多公眾號,這個類別在kafka里就叫topic主題
一個消費者可以訂閱多個主題
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM