kombu是一个python的消息库。
Kombu的目标是通过为AMQP协议提供一个地道的高层次接口,来使python中的消息编程更为简单。同时也为通用的消息问题提供试验和测试的解决方案。
术语:
- 生产者
生产者发送消息到交换器。
- 交换器
消息被发送到交换器. 交换器是有名称的,而且可以被配置使用多个路由算法。交换器通过匹配消息中的路由键值来将消息路由给消费者。消费者绑定到交换器时需要提供关心的路由键值。
- 消费者
消费者声明一个队列,将它绑定到交换器并从中接收消息。
- 队列
队列接收发送到交换器的消息。队列是被消费者声明的。
- 路由键
每个消息都有一个路由键。对路由键的解释依懒于交换器的类型。标准AMQP默认有4种交换器类型, 不同的实现可以自定义类型 (需要查看相应手册获取相关信息).
下面是 AMQP/0.8的定义的默认交换器类型:
Direct 交换器
如果一个消息的路由键属性和消费者的路由键值一致则匹配。
Fan-out交换器
总是匹配, 尽管绑定不有一个路由键值。
Topic 交换器
通过一个原生的类型匹配模式来匹配消息的路由键。消息的路由键值由多个"."分隔的单词组成。(”.”,就像域名一样), 有2个特殊的符号可以使用; 星号 (“*”)和 (“#”). "*"匹配任何单词 ,"#"匹配0个或多个单词. 比如“*.stock.#” 匹配“usd.stock” 和“eur.stock.db” ,但是不匹配“stock.nasdaq”.
举个例子:
下面我们以一个Hello World程序作为本篇博客的结尾,看看Kombu是怎么帮助我们实现消息通信的。一些细节看不懂没关系,在后续我们会对里面的每个对象进行深入的学习。
首先是消息发送端hello_publisher.py:
from kombu import Connection
import datetime
# "amqp://guest:guest@localhost:5672//"中的amqp就是上文所提到的transport,
# 后面的部分是连接具体transport所需的参数,具体含义下篇博客中会讲到
with Connection('amqp://guest:guest@localhost:5672//') as conn:
simple_queue = conn.SimpleQueue('simple_queue')
message = 'helloword, sent at %s' % datetime.datetime.today()
simple_queue.put(message)
print('Sent: %s' % message)
simple_queue.close()
然后是消息接收端hello_consumer.py:
from kombu import Connection
with Connection('amqp://guest:guest@localhost:5672//') as conn:
simple_queue = conn.SimpleQueue('simple_queue')
message = simple_queue.get(block=True, timeout=1)
print("Received: %s" % message.payload)
message.ack()