celery内置了kombu库,看了一下kombu的源码,从官网最简单的一个例子来分析---消息发布,源码如下:

from __future__ import absolute_import, unicode_literals
import datetime from kombu import Connection
with Connection('redis://localhost:6379/0') as conn:
simple_queue = conn.SimpleQueue('simple_queue')
message = 'helloworld, sent at {0}'.format(datetime.datetime.today())
simple_queue.put(message)
print('Sent: {0}'.format(message))
simple_queue.close()

运行之前开启redis服务。这真是简单到不能到简单的例子-.-

一步步分析画出如下类图:

大概十七八个类。流程省略几百万个字。

记一下关键步骤:

1、创建生产者 messaging.Producer 时不会操作redis。

2、创建消息者 messaging.Consumer 时会创建exchange,及其对应的 routing_key、patter、queue(队列名称),具体格式像这样:

 _kombu.binding.exchange_name => (routing_key\x06\x16pattern\x06\x16queue_name)
这是一个sadd操作,key是 _kombu.binding.exchange_name,前面是固定的,exchange_name是变化的;
value是 routing_key、pattern、和绑定的队列名。\x06\x16是分隔符。这可以从redis里面看出:


生产者在publish消息时,调用的是:
def _publish(self, body, priority, content_type, content_encoding,
headers, properties, routing_key, mandatory,
immediate, exchange, declare):

可以看到,生产者只需要知道exchange、routing_key就可以发消息到队列。发送到redis的消息内容如下:

这是个lpush命令,key是队列名、value是消息内容连同元数据:

lpush queue_name => [message, ... ]

生产者producer发布消息到此结束。

其中kombu对redis库做了一下简单的封装,里面有个AsyncRedis类,不过貌似没什么卵用。

借鉴kombu里对redis封装的设计,我封装了一下redis,使用简单,绝对无公害。地址在这:Python RedisChannel

kombu源码Producer收获一的更多相关文章

  1. Kombu源码分析(一)概述

    Celery是Python中最流行的异步消息队列框架,支持RabbitMQ.Redis.ZoopKeeper等作为Broker,而对这些消息队列的抽象,都是通过Kombu实现的.Kombu实现了对AM ...

  2. [源码分析] 消息队列 Kombu 之 Producer

    [源码分析] 消息队列 Kombu 之 Producer 目录 [源码分析] 消息队列 Kombu 之 Producer 0x00 摘要 0x01 示例代码 0x02 来由 0x03 建立 3.1 定 ...

  3. [源码解析] 消息队列 Kombu 之 基本架构

    [源码解析] 消息队列 Kombu 之 基本架构 目录 [源码解析] 消息队列 Kombu 之 基本架构 0x00 摘要 0x01 AMQP 1.1 基本概念 1.2 工作过程 0x02 Poll系列 ...

  4. [源码分析] 消息队列 Kombu 之 启动过程

    [源码分析] 消息队列 Kombu 之 启动过程 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 是 ...

  5. [源码分析] 消息队列 Kombu 之 Consumer

    [源码分析] 消息队列 Kombu 之 Consumer 目录 [源码分析] 消息队列 Kombu 之 Consumer 0x00 摘要 0x01 综述功能 0x02 示例代码 0x03 定义 3.1 ...

  6. [源码分析] 消息队列 Kombu 之 Hub

    [源码分析] 消息队列 Kombu 之 Hub 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 中的 ...

  7. [源码分析] 消息队列 Kombu 之 mailbox

    [源码分析] 消息队列 Kombu 之 mailbox 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Komb ...

  8. Backbone源码阅读手记

    Backbone.js是前端的MVC框架,它通过提供模型Models.集合Collection.视图Veiew赋予了Web应用程序分层结构.从源码中可以知道,Backbone主要分了以下几个模块: ( ...

  9. Flask源码学习—config配置管理

    自己用Flask做了一个博客(www.hbnnlove.sinaapp.com),之前苦于没有对源码解析的文档,只能自己硬着头皮看.现在我把我自己学习Flask源码的收获写出来,也希望能给后续要学习F ...

随机推荐

  1. Python列表知识点讲解

    增删改查 增 X.append函数是在原有列表中的末尾追加一个新的元素存放在列表中 X.extend() 将一个列表中的元素添加到另一个列表中,将所引用的原列表保持不变,同时extend还可以运用到, ...

  2. git初次推送

    第一次配置Git git config --global user.name "xxxx" git config --global user.email "xxxx@xx ...

  3. 《linux内核设计与实现》第二章

    第二章 从内核出发 一.获取内核源码 1.使用Git(linux创造的系统) 使用git来获取最新提交到linux版本树的一个副本: $ git clone git://git.kernel.org/ ...

  4. 《Linux内核分析》第一周——计算机是如何工作的?

    杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 课程内容 1.诺曼依体系 ...

  5. spring boot 添加整合ssl使得http变成https方法

    1. https出现的背景:(1)都知道http传输协议是裸漏的,明文传输的,极易被黑客拦截,因此,(2)人们想出的使用加密,也就是 对称加密 例如aes,不过这个由于因为对称加密需要每个客户端和服务 ...

  6. nil Nil NULL NSNull 之间的区别

    nil -> Null-pointer to objective- c objectNIL -> Null-pointer to objective- c class  表示对类进行赋空值 ...

  7. 2017-08-20 block,inline和inline-block概念和区别

    display:inline.block.inline-block的区别 display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都 ...

  8. week5-Link Layer

    Technology:Internets and Packets course Layer 1 : Link Introduction/The Link Layer moving from histo ...

  9. [转帖] CentOS 添加新的CA证书到认证地方

    Install the ca-certificates package: yum install ca-certificates Enable the dynamic CA configuration ...

  10. 5 vue-cli整合axios的几种方法

    vue-cli配置axios https://www.cnblogs.com/rinzoo/p/7880525.html https://www.cnblogs.com/XHappyness/p/76 ...