Kombu 源碼解析一

聲明:本文僅限于簡書發(fā)布禁谦,其他第三方網(wǎng)站均為盜版导盅,原文地址: Kombu 源碼解析一

Kombu 源碼解析一

玩 Python 的同學(xué)可能很多都聽說過甚至玩過 Celery,Celery 作為 Python 中最流行的異步消息隊(duì)列可以說是非常得受歡迎。但是梧兼,用得多的同學(xué)相信也是有一個(gè)感觸,那就是時(shí)不時(shí)會(huì)遇到莫名奇妙的坑智听,而且最后都只能通過重啟解決羽杰,因?yàn)橐业皆驅(qū)嵲诓皇且患菀椎氖虑椤?/p>

而我作為這受傷人群中的一個(gè),想了解一下這個(gè)大坑內(nèi)部的原理到推,所以就曾經(jīng)扒過它內(nèi)部的實(shí)現(xiàn)考赛,但是,由于 Celery 確實(shí)有點(diǎn)龐大环肘,而且我認(rèn)為代碼實(shí)現(xiàn)得也不是很多欲虚,所以,只是學(xué)習(xí)到了一部分的知識悔雹,但是复哆,卻是收獲良多。所以腌零,最近因?yàn)楦鞣N情況梯找,我這次深扒一次,所以后續(xù)將會(huì)有一系列的文章是講 Celery 實(shí)現(xiàn)的益涧。

當(dāng)你嘗試查看 Celery 的源碼的時(shí)候锈锤,你會(huì)發(fā)現(xiàn)有一個(gè)你根本繞不過的坑的,那就是 Kombu闲询,Kombu 的定位是一個(gè)兼容 AMQP 協(xié)議的消息隊(duì)列抽象久免,但是,這只是作者的一面說辭扭弧,你看完代碼就知道了阎姥,它是嘗試做異步MQ 的兼容 AMQP 的抽象隊(duì)列。所以鸽捻,我決定先從 Kombu 的代碼寫起呼巴,而這篇文章是第一篇!

我在這個(gè)系列里面講的都是 Kombu 4.1.0 和 Celery 4.1.0 的事御蒲,先提前說一下衣赶,以免后續(xù)的同學(xué)對不上號。

下載 Kombu 代碼

Kombu 的代碼很好找厚满,因?yàn)樗?Celery 是強(qiáng)耦合的府瞄,所以,它的代碼放在 Celery 的代碼組里頭碘箍,可以很簡單得 Github 上找到摘能,所以下載也是很簡單了:

> git clone https://github.com/celery/kombu.git
> cd kombu
> git checkout v4.1.0

這樣续崖,你就得到了我這個(gè)系列文章里面的 Kombu 的源代碼了,而我后面的所有代碼來源以及行數(shù)都是對應(yīng)這個(gè)版本的代碼的团搞!

整體 Review

拿到代碼之后严望,我就先摒棄所有的非代碼部分,直接來整體看看 kombu 這個(gè)目錄下有什么:

可以看到逻恐,在 kombu 這個(gè)目錄里面大部分都是文件像吻,而只有三個(gè)文件夾,分別是:

  • async:異步操作函數(shù)
  • transport:兼容各種 MQ 的類
  • utils: 一些輔助 函數(shù)

從這個(gè)目錄中复隆,我們就發(fā)現(xiàn)了一些問題拨匆,你說你既然是抽象 MQ 的,你要啥異步操作啊挽拂,這有點(diǎn)越界了呀喂惭每。

簡單添加/獲取消息

OK,概覽完我們看一些實(shí)際的東西亏栈,先嘗試用 Kombu 寫一個(gè)生產(chǎn)/消費(fèi)的代碼吧台腥,這個(gè) DEMO 分為兩部分

  • simple_receive.py:一個(gè)簡單的消費(fèi)者
  • simple_send.py:一個(gè)簡單的生產(chǎn)者

下面看看這兩段代碼都是怎么寫的:

還是老規(guī)矩,這兩段代碼你都可以在我的 Github 中找到绒北。先看看看消費(fèi)者黎侈,消費(fèi)者的代碼比較簡單,我們先建立和 MQ 的連接闷游,然后再從 MQ 的指定隊(duì)列里面將消息拿出來峻汉,處理掉。

而生產(chǎn)者則相反脐往,前面也是要先和隊(duì)列建立連接休吠,但是,有一點(diǎn)不一樣的是這里創(chuàng)建了一個(gè) exchange业簿,然后再往隊(duì)列里面發(fā)送消息瘤礁,而發(fā)送消息的同時(shí)還是搭配好多參數(shù)。

這里就是 Kombu 有意思的一點(diǎn)了辖源,它意圖對所有的 MQ 進(jìn)行抽象,然后通過接口對外暴露出一致的 API希太,這樣我們就不用關(guān)心底層用的是什么 MQ 了克饶,Redis/RabbitMQ/MongoDB 之類的隨便切換。

Kombu 的 MQ 模型

因?yàn)?Kombu 是對 AMQP 進(jìn)行抽象誊辉,所以它必定有抽象的模型矾湃,事實(shí)上,它大體上和 RabbitMQ 差不多堕澄,但是邀跃,不完全一樣霉咨,有一些差別,下面就介紹一下 Konbu 的抽象模型拍屑。

在 Kombu 中途戒,存在多個(gè)概念,其實(shí)我們在前邊簡單的生產(chǎn)/消費(fèi)者樣例中已經(jīng)看到了了一些僵驰,他們分別是:

  • Message:生產(chǎn)消費(fèi)的基本單位喷斋,其實(shí)就是我們所謂的一條條消息
  • Connection:對 MQ 連接的抽象,一個(gè) Connection 就對應(yīng)一個(gè) MQ 的連接
  • Transport:真實(shí)的 MQ 連接蒜茴,也是真正連接到 MQ(redis/rabbitmq) 的實(shí)例
  • Producers: 發(fā)送消息的抽象類
  • Consumers:接受消息的抽象類
  • Exchange:MQ 路由星爪,這個(gè)和 RabbitMQ 差不多,支持 5 類型
  • Queue:對應(yīng)的 queue 抽象粉私,其實(shí)就是一個(gè)字符串的封裝

消息是發(fā)送到那個(gè) Queue 的

假設(shè)我們想要發(fā)送一個(gè)消息到 Redis 中名為 'test' 的 queue 中顽腾,那么 Kombu 是怎么做的,這就設(shè)計(jì)到 Exchange 的概念了诺核。目前 Kombu 對于不同 MQ 的支持是這樣的:

假設(shè)我們用的是 Direct抄肖,那么我們的 Producer 在生產(chǎn)的時(shí)候只需要指定 Queue=test 即可,這樣就會(huì)發(fā)送的 test 這個(gè) queue 中猪瞬。更多關(guān)于 Exchange 的知識可以參考:AMQP 0-9-1 Model Explained

這一篇就先介紹到這里憎瘸,后續(xù)就開始深入到代碼層面,看下這個(gè)模型中的各個(gè)實(shí)體是如何實(shí)現(xiàn)的陈瘦。

Reference

  1. AMQP 0-9-1 Model Explained
  2. Kombu Docs
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幌甘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痊项,更是在濱河造成了極大的恐慌锅风,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞍泉,死亡現(xiàn)場離奇詭異皱埠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咖驮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門边器,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人托修,你說我怎么就攤上這事忘巧。” “怎么了睦刃?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵砚嘴,是天一觀的道長。 經(jīng)常有香客問我,道長际长,這世上最難降的妖魔是什么耸采? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮工育,結(jié)果婚禮上虾宇,老公的妹妹穿的比我還像新娘。我一直安慰自己翅娶,他們只是感情好文留,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竭沫,像睡著了一般燥翅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜕提,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天森书,我揣著相機(jī)與錄音,去河邊找鬼谎势。 笑死凛膏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脏榆。 我是一名探鬼主播猖毫,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼须喂!你這毒婦竟也來了吁断?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤坞生,失蹤者是張志新(化名)和其女友劉穎仔役,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體是己,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡又兵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卒废。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沛厨。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摔认,靈堂內(nèi)的尸體忽然破棺而出逆皮,到底是詐尸還是另有隱情,我是刑警寧澤级野,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布页屠,位于F島的核電站,受9級特大地震影響蓖柔,放射性物質(zhì)發(fā)生泄漏辰企。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一况鸣、第九天 我趴在偏房一處隱蔽的房頂上張望牢贸。 院中可真熱鬧,春花似錦镐捧、人聲如沸潜索。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竹习。三九已至,卻和暖如春列牺,著一層夾襖步出監(jiān)牢的瞬間整陌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工瞎领, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泌辫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓九默,卻偏偏與公主長得像震放,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子驼修,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理殿遂,服務(wù)發(fā)現(xiàn),斷路器邪锌,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 來源 RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器勉躺。支持消息的持久化、事務(wù)觅丰、擁塞控...
    jiangmo閱讀 10,344評論 2 34
  • 關(guān)于消息隊(duì)列饵溅,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了妇萄,但一直沒騰出空蜕企,近來分別碰到幾個(gè)朋友聊這塊的技術(shù)選型,是時(shí)...
    預(yù)流閱讀 584,422評論 51 785
  • RabbitMQ詳解 本文地址:http://www.host900.com/index.php/articles...
    嘉加家佳七閱讀 2,501評論 0 9
  • AMQP大致內(nèi)容就是冠句,將消息和隊(duì)列綁定起來轻掩,規(guī)定讓進(jìn)入到交換機(jī)中的具有某個(gè)路由鍵的消息進(jìn)入到指定隊(duì)列中去。 Rab...
    StevenMD閱讀 1,850評論 0 3