前言
昨天發了一篇文章是關於
machinery
的入門教程,有一位讀者在留言中問我 這個和kafka有什麼區別?一時我也有點懵,這兩個的概念很近,到底有什麼不一樣呢?根據我本身的理解,簡單分析了一下,有不足之處歡迎指出。golang
消息隊列
消息隊列這個概念其實在我以前的文章:手把手教姐姐寫消息隊列,本身動手用go寫一個簡易版的消息隊列,有興趣的小夥伴們能夠看一下這篇文章。迴歸正題,咱們再來介紹一下什麼是消息隊列。web
消息隊列,通常咱們會簡稱它爲MQ(Message Queue)。他是由兩個單詞組成,咱們應該對隊列(Queue)很熟悉吧。隊列是一種先進先出的數據結構。再配合上消息,消息隊列能夠簡單理解爲:把要傳輸的數據放在隊列中。使用較多的消息隊列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。這裏咱們就不具體講解消息隊列實現細節,這不是本文的主題,只知道概念就能夠了。瞭解了什麼是消息隊列,咱們一塊兒來看看他在什麼場景使用。面試
場景
消息隊列中間件是分佈式系統中重要的組件,主要解決應用耦合,異步消息,流量削鋒等問題。這裏舉一個消息隊列的使用場景:日誌處理。redis
日誌處理是指將消息隊列用在日誌處理中,好比Kafka的應用,解決大量日誌傳輸的問題。架構簡化以下:設計模式
-
日誌採集客戶端,負責日誌數據採集,定時寫入 Kfaka
隊列。 -
Kfaka
消息隊列,負責日誌數據的接收,存儲和轉發。 -
日誌處理應用,訂閱並消費kafka隊列中日誌數據。
任務隊列
既然消息隊列稱爲MQ,那麼任務隊列咱們就能夠叫其TQ(Task Message)。任務隊列能夠簡單理解爲:把要執行的任務放在隊列中。使用較多的任務隊列有machiney
、Celery
、goWorker
、YTask
。每個任務隊列都有本身的特色,這裏就不細講了。我寫了一篇machinery
入門教程,而且翻譯了一篇machinery
中文文檔,有須要的公衆號自取。具體任務隊列的細節就不講了。這不是本文的主題,下面咱們看一看任務隊列的使用場景。緩存
場景
任務隊列是用來執行一個耗時任務。你們可能都使用過馬爸爸的花唄,每當咱們還款時,就會增長本身的芝麻信用分。這就能夠用到任務隊列來計算用戶的積分和等級了。架構簡化以下:微信
-
用戶還款,當用戶還款成功時,發送一個計算用戶積分計算的任務到任務隊列。網絡
-
任務隊列,能夠是
mq
,也但是redis
,用來存儲任務。數據結構 -
任務執行者,任務的執行者,監放任務隊列,當任務隊列中有任務時,便會執行。架構
區別
消息隊列和任務隊列,我以爲最大的不一樣就是理念的不一樣:任務隊列傳遞的是"任務",消息隊列傳遞的是"消息"。任務隊列能夠說是消息隊列的二次開發。
經過上面兩個場景例子,咱們能夠總結一下二者區別:
-
消息隊列更側重於消息的吞吐、處理,具備有處理海量信息的能力。另外利用消息隊列的生產者和消費者的概念,也能夠實現任務隊列的功能,可是還須要進行額外的開發處理。 -
任務隊列則提供了執行任務所需的功能,好比任務的重試,結果的返回,任務狀態記錄等。雖然也有併發的處理能力,但通常不適用於高吞吐量快速消費的場景。其實任務隊列和遠程函數調用很像,不過和rpc調用不一樣,他的調用不是網絡請求的方式,而是經過利用消息隊列傳遞任務信息。
綜上所述,我的認爲任務隊列就是消息隊列在異步場景下的深度二次開發,根據實際項目開發根據實際場景作相應選擇便可。
後言
以上全是我的理解,有什麼不對的,歡迎指出。
好啦,這一篇文章到這就結束了,咱們下期見~~。但願對大家有用。可添加個人golang交流羣,咱們一塊兒學習交流。
結尾給你們發一個小福利吧,最近我在看[微服務架構設計模式]這一本書,講的很好,本身也收集了一本PDF,有須要的小夥能夠到自行下載。獲取方式:關注公衆號:[Golang夢工廠],後臺回覆:[微服務],便可獲取。
我翻譯了一份GIN中文文檔,會按期進行維護,有須要的小夥伴後臺回覆[gin]便可下載。
本身翻譯了一份machinery
官方中文文檔,會按期維護,有須要的小夥伴後臺回覆[machinery]便可下載。
我是asong,一名普普統統的程序猿,讓gi我一塊兒慢慢變強吧。我本身建了一個golang
交流羣,有須要的小夥伴加我vx
,我拉你入羣。歡迎各位的關注,咱們下期見~~~
推薦往期文章:
本文分享自微信公衆號 - Golang夢工廠(AsongDream)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。