rabbitmq中文教程python版 - 介绍

源码:https://github.com/ltoddy/rabbitmq-tutorialpython

介绍

RabbitMQ是一个消息代理:它接受和转发消息。你能够把它想象成一个邮局:当你把你想要发布的邮件放在邮箱中时,你能够肯定邮差先生最终将邮件发送给你的收件人。在这个比喻中,RabbitMQ是邮政信箱,邮局和邮递员。git

RabbitMQ和邮局的主要区别在于它不处理纸张,而是接受,存储和转发二进制数据块 -- 消息。github

请注意,生产者,消费者和消息代理没必要驻留在同一主机上; 实际上在大多数应用程序中它们不是同一主机上。小程序

Hello World!

(using the Pika Python client)服务器

pip3 install pika

在本教程的这一部分,咱们将使用Python编写两个小程序; 发送单个消息的生产者(发送者),以及接收消息并将其打印出来的消费者(接收者)。这是一个消息传递的“Hello World”。网络

在下图中,“P”是咱们的生产者,“C”是咱们的消费者。中间的盒子是一个队列 - RabbitMQ表明消费者保存的消息缓冲区。函数

咱们的总体设计将以下所示:工具

image

生产者将消息发送到“hello”队列,消费者接收来自该队列的消息。

发送

image

咱们的第一个程序 send.py 会向队列发送一条消息。咱们须要作的第一件事是与RabbitMQ服务器创建链接。spa

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

咱们如今链接到本地上的的代理 - 所以是 'localhost'。若是咱们想链接到另外一台机器上的代理,咱们只需在此指定其名称或IP地址。设计

接下来,在发送以前,咱们须要确保收件人队列存在。若是咱们发送消息到不存在的位置,RabbitMQ将只删除该消息。咱们来建立一个将传递消息的 hello 队列:

channel.queue_declare(queue='hello')

此时咱们准备发送消息。咱们的第一条消息将只包含一个字符串 "Hello World!"咱们想把它发送给咱们的 hello 队列。

在RabbitMQ中,消息永远不会直接发送到队列,它老是须要通过交换。咱们如今须要知道的是如何使用由空字符串标识的默认交换。这种交换是特殊的 - 它容许咱们准确地指定消息应该到达哪一个队列。队列名称须要在routing_key参数中指定:

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")

在退出程序以前,咱们须要确保网络缓冲区被刷新,而且咱们的消息被实际传送到RabbitMQ。咱们能够经过轻轻关闭链接来完成。

connection.close()

接收

image

咱们的第二个程序 receive.py 将接收队列中的消息并将它们打印在屏幕上。

再次,咱们首先须要链接到RabbitMQ服务器。负责链接到Rabbit的代码与之前相同。

下一步,就像之前同样,要确保队列存在。使用queue_declare建立一个队列是幂等的 - 咱们能够根据须要屡次运行该命令,而且只会建立一个。

channel.queue_declare()

您可能会问为何咱们再次声明队列 - 咱们已经在以前的代码中声明了它。若是咱们确信队列已经存在,咱们能够避免这种状况。例如,若是 send.py 程序以前运行过。但咱们还不肯定首先运行哪一个程序。在这种状况下,重复在两个程序中重复声明队列是一种很好的作法。

列出队列

您可能但愿看到RabbitMQ有什么队列以及它们中有多少条消息。您可使用rabbitmqctl工具(做为特权用户)执行此操做:

> sudo rabbitmqctl list_queues

在Windows上,省略sudo:

> rabbitmqctl.bat list_queues

从队列接收消息更为复杂。它经过向队列订阅 回调函数 来工做。每当咱们收到一条消息,这个回调函数就被皮卡库调用。在咱们的例子中,这个函数会在屏幕上打印消息的内容。

def callback(ch, method, propertites, body):
    print(" [x] Received {}".format(body))

接下来,咱们须要告诉RabbitMQ这个特定的回调函数应该从咱们的hello队列接收消息:

channel.basic_consume(callable, queue='hello', no_ack=True)

为了让这个命令成功,咱们必须确保咱们想要订阅的队列存在。幸运的是,咱们对此有信心 - 咱们已经使用queue_declare建立了一个队列。

NO_ACK参数,后面(几篇以后)会有解释。

最后,咱们进入一个永无止境的循环,等待数据并在必要时运行回调。

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

把它放在一块儿

send.py的完整代码:

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()


channel.queue_declare(queue='hello')

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

receive.py的完整代码:

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')


def callback(ch, method, propertites, body):
    print(" [x] Received {}".format(body))


channel.basic_consume(callable,
                      queue='hello',
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

如今咱们能够在终端上试用咱们的程序。首先,让咱们开始一个消费者,它将持续运行等待交付:

python receive.py
# => [*] Waiting for messages. To exit press CTRL+C
# => [x] Received 'Hello World!'

如今开始制做。生产者计划将在每次运行后中止:

python send.py
# => [x] Sent 'Hello World!'

欢呼!咱们可以经过RabbitMQ发送咱们的第一条消息。正如您可能已经注意到的,receive.py 程序不会退出。它会随时准备接收更多消息,并可能会被Ctrl-C中断。

尝试在新终端中再次运行 send.py

image

相关文章
相关标签/搜索