首页 > 代码库 > RabbitMQ官网教程---简介

RabbitMQ官网教程---简介

RabbitMQ是一个消息broker。最主要的想法是非常简单:它接收并且传送消息。你可以把它看做一个邮局:当你给邮箱里发了一个邮件,你会很确定邮递员最终会将邮件传递到你的接收人那里。使用这种比喻RabbitMQ是一个邮箱,一个邮局和一个邮递员。


在RabbitMQ与邮局之间主要的不同点是它不会处理纸张,相反会接收,存储并且传送二进制的数据-消息。


通常来说,用术语而言,RabbitMQ就是消息。


Producing意思是除了发送不会做其它事情。一个发送消息的程序是一个producer。我们将把它用“P”画出:

技术分享

queue是一个邮箱的名字。它寄居在RabbitMQ里面。尽管消息流通过RabbitMQ和你的应用程序,但是它们可以仅仅被存储在一个queue钟。queue没有被任何限制绑定,它可以存储尽可能你喜欢的消息-它相当于一个无限制的缓存。许多producer可以发送消息到一个queue钟,许多consumer可以尝试从queue中接收消息。queue将像下面的图一样被画出:

技术分享

Consuming跟接收的意思相近。Consumer是很多时候等待接收消息的程序。我们用“C”画出它:

技术分享

注意producer,consumer和brokder不需要驻留在相同的机器上;其实在大多数应用程序中它们不在同一机器上。


Hello World!

(使用pika 0.9.8 Python client)

我们的"Hello world"不会太复杂-我们来发送一个消息,接收它并且在屏幕上打印它。为了做这样一个程序我们需要两个程序:一个发送消息并且一个接收消息并且打印它。


我们的设计将会是这样:

技术分享

Producer发送消息到"hello"队列,consumer从那个队列中接收消息

RabbitMQ库

RabbitMQ称述了一种被叫做AMQP的协议。为了使用Rabbit你将需要一个跟Rabbit一样理解这个协议的库。每个程序语言几乎都有可选的这样的库。对于python是不同的并且没有许多的库可供选择:

    py-amqplib
    txAMQP
    pika
   
在这个系列教程中我们将使用pika。你可以使用pip包管理工具安装它:

sudo pip install pika==0.9.8

安装依赖于pip和git-core包,你可能需要首先安装它们。

在ubuntu上:
sudo apt-get install python-pip git-core

在Debian上:
sudo apt-get install python-setuptools git-core
sudo easy_install pip

在Windows上:
easy_install pip
pip install pika==0.9.8


发送

技术分享

我们的第一个程序send.py将发送一个消息给队列。我们需要做的第一件事情是与RabbitMQ建立一个连接:

#!/usr/bin/env python
import pika

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


我们现在已经连接到了本地的一个broker-由于localhost。如果我们想连接到一个不同的broker的机器那么我们就需要简单的在这里指定它的名字或者IP。


接下来,在发送以前我们需要确信接收队列已经存在。如果我们给一个不存在的地址发送消息,RabbitMQ将会丢弃消息。我们来创建一个将要被传递的命名为"hello"的队列:

channel.queue_declare(queue="hello")


在那个阶段我们已经准备好发送一个消息了。我们的第一个消息将只包含一个字符串Hello World!并且我们把它发送给我们的hello队列。


在RabbitMQ中一个消息可能永远不会直接被发送到队列中,它总是需要通过一个交换。但是我们不需要深究-你可以读更多的交互信息在the third part of this tutorial中。我们只需要做的是如何通过一个空字符串使用一个交换标识。这种交换是特别的-它允许我们精确的指定消息应该进入哪一个队列中。队列名需要在routing_key参数中指定:

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

在程序退出以前我们需要确信网络缓存已经被刷新并且我们的消息确实被传递到了RabbitMQ。我们可以通过平滑的关闭连接处理它。

connection.close()



发送不生效

如果这是你第一次使用RabbitMQ并且你没有看"Sent"消息,然后你也许会打破脑袋想知道可能的错误是什么。也许这个broker在没有充足磁盘空间的时候被开启(默认需要至少1Gb的空间)因此拒绝接受消息。检查broker日志文件来确信并且如果需要,那么减少limit。configuration file documentation将展示给你如何设置disk_free_limit。


接收

技术分享

我们的第二个程序是receive.py将接收来自队列的消息并且在屏幕上打印它们。


再一次,我们首先需要跟RabbitMQ服务器连接。连接代码与前面的是相同的。


接下来,就像以前一样,确保队列存在。使用queue_declare创建一个队列是幂等的-我们只需要创建一次这个队列就可以运行这个命令很多次了。

channel.queue_declare(queue=‘hello‘)

你也许会问为什么我们又要定义一次队列-我们已经在前面的代码中定义过了。如果我们确保队列已经存在我们可以避免创建它。例如如果send.py程序在前面运行了。但是我们不确定哪一个程序先运行。在两个程序中定义重复的队列像这样的例子是一个好的实践。

列出队列

你也许想要看看RabbitMQ中有什么队列并且在它们中有多少消息。你可以使用rabbitmqctl工具像下面这样做:

sudo rabbitmqctl list_queues
Listing queues ...
hello 0
...done.

在windows上忽略sudo


从队列中接收消息是复杂的。它通过订阅一个回调函数给队列。无论我们什么时候接收到一个消息,这个回调函数会通过Pika库被调用。在我们的例子中,这个函数将把消息的内容打印在屏幕上。

def callback(ch, method, properties, body):
    print "[x] Received %r"%(body,)


接下来,我们需要告诉RabbitMQ这个特别的回调函数应该从我们的hello队列中接收消息:

channel.basic_consume(callback, 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(host=‘localhost‘))
channel = connection.channel()

channel.queue_declare(queue=‘hello‘)

print "[*] Waiting for messages. To exit press CTRL+C"

def callback(ch, method, properties, body):
    print "[x] Receieved %r"%(body,)
    
channel.basic_consume(callback, queue=‘hello‘,no_ack=True)

channel.start_consuming()


后面的python文件的执行就不翻译了,相信用python的都知道或者能看懂了


RabbitMQ官网教程---简介