Kombu 源码解析一

声明:本文仅限于简书发布,其他第三方网站均为盗版,原文地址: Kombu 源码解析一

Kombu 源码解析一

玩 Python 的同学可能很多都听说过甚至玩过 Celery,Celery 作为 Python 中最流行的异步消息队列可以说是非常得受欢迎。但是,用得多的同学相信也是有一个感触,那就是时不时会遇到莫名奇妙的坑,而且最后都只能通过重启解决,因为要找到原因实在不是一件容易的事情。

而我作为这受伤人群中的一个,想了解一下这个大坑内部的原理,所以就曾经扒过它内部的实现,但是,由于 Celery 确实有点庞大,而且我认为代码实现得也不是很多,所以,只是学习到了一部分的知识,但是,却是收获良多。所以,最近因为各种情况,我这次深扒一次,所以后续将会有一系列的文章是讲 Celery 实现的。

当你尝试查看 Celery 的源码的时候,你会发现有一个你根本绕不过的坑的,那就是 Kombu,Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象,但是,这只是作者的一面说辞,你看完代码就知道了,它是尝试做异步MQ 的兼容 AMQP 的抽象队列。所以,我决定先从 Kombu 的代码写起,而这篇文章是第一篇!

我在这个系列里面讲的都是 Kombu 4.1.0 和 Celery 4.1.0 的事,先提前说一下,以免后续的同学对不上号。

下载 Kombu 代码

Kombu 的代码很好找,因为它和 Celery 是强耦合的,所以,它的代码放在 Celery 的代码组里头,可以很简单得 Github 上找到,所以下载也是很简单了:

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

这样,你就得到了我这个系列文章里面的 Kombu 的源代码了,而我后面的所有代码来源以及行数都是对应这个版本的代码的!

整体 Review

拿到代码之后,我就先摒弃所有的非代码部分,直接来整体看看 kombu 这个目录下有什么:

可以看到,在 kombu 这个目录里面大部分都是文件,而只有三个文件夹,分别是:

  • async:异步操作函数
  • transport:兼容各种 MQ 的类
  • utils: 一些辅助 函数

从这个目录中,我们就发现了一些问题,你说你既然是抽象 MQ 的,你要啥异步操作啊,这有点越界了呀喂。

简单添加/获取消息

OK,概览完我们看一些实际的东西,先尝试用 Kombu 写一个生产/消费的代码吧,这个 DEMO 分为两部分

  • simple_receive.py:一个简单的消费者
  • simple_send.py:一个简单的生产者

下面看看这两段代码都是怎么写的:

还是老规矩,这两段代码你都可以在我的 Github 中找到。先看看看消费者,消费者的代码比较简单,我们先建立和 MQ 的连接,然后再从 MQ 的指定队列里面将消息拿出来,处理掉。

而生产者则相反,前面也是要先和队列建立连接,但是,有一点不一样的是这里创建了一个 exchange,然后再往队列里面发送消息,而发送消息的同时还是搭配好多参数。

这里就是 Kombu 有意思的一点了,它意图对所有的 MQ 进行抽象,然后通过接口对外暴露出一致的 API,这样我们就不用关心底层用的是什么 MQ 了,Redis/RabbitMQ/MongoDB 之类的随便切换。

Kombu 的 MQ 模型

因为 Kombu 是对 AMQP 进行抽象,所以它必定有抽象的模型,事实上,它大体上和 RabbitMQ 差不多,但是,不完全一样,有一些差别,下面就介绍一下 Konbu 的抽象模型。

在 Kombu 中,存在多个概念,其实我们在前边简单的生产/消费者样例中已经看到了了一些,他们分别是:

  • Message:生产消费的基本单位,其实就是我们所谓的一条条消息
  • Connection:对 MQ 连接的抽象,一个 Connection 就对应一个 MQ 的连接
  • Transport:真实的 MQ 连接,也是真正连接到 MQ(redis/rabbitmq) 的实例
  • Producers: 发送消息的抽象类
  • Consumers:接受消息的抽象类
  • Exchange:MQ 路由,这个和 RabbitMQ 差不多,支持 5 类型
  • Queue:对应的 queue 抽象,其实就是一个字符串的封装

消息是发送到那个 Queue 的

假设我们想要发送一个消息到 Redis 中名为 'test' 的 queue 中,那么 Kombu 是怎么做的,这就设计到 Exchange 的概念了。目前 Kombu 对于不同 MQ 的支持是这样的:

假设我们用的是 Direct,那么我们的 Producer 在生产的时候只需要指定 Queue=test 即可,这样就会发送的 test 这个 queue 中。更多关于 Exchange 的知识可以参考:AMQP 0-9-1 Model Explained

这一篇就先介绍到这里,后续就开始深入到代码层面,看下这个模型中的各个实体是如何实现的。

Reference

  1. AMQP 0-9-1 Model Explained
  2. Kombu Docs
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,490评论 18 139
  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 10,335评论 2 34
  • 关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时...
    预流阅读 584,147评论 51 785
  • RabbitMQ详解 本文地址:http://www.host900.com/index.php/articles...
    嘉加家佳七阅读 2,493评论 0 9
  • AMQP大致内容就是,将消息和队列绑定起来,规定让进入到交换机中的具有某个路由键的消息进入到指定队列中去。 Rab...
    StevenMD阅读 1,826评论 0 3