首页 > 代码库 > rabbitmq 入门基础(一)
rabbitmq 入门基础(一)
第一章:Rabbitmq简介
简介:
Rabbitmq是一个消息中间件。主要用于消息的转发和接收。如果把rabbitmq比作邮局:只要你将信件投递到邮箱,你就可以确信邮递员将可以把你的信件递送到目的地。Rabbitmq的功能就相当于邮箱、邮局、邮递员的所代表的功能。
邮局递送的是纸质信件,Rabbitmq所不同之处就是其功能是接收、存储和转发的是二进制大对象数据。即Messages。
Rabbitmq相关术语:
(1) Producing(生产):生产相当于消息发送(sending),我们把发送消息的程序成为一个生产者(producer)。用如下图形表示:
(2) queue(队列):Rabbitmq的队列相当于上文比喻的邮箱。它位于rabbitmq内部。尽管消息在应用程序和Rabbitmq间传递,但其只能保存在队列中。如果未对队列设定限制条件,队列是能够保存你想保存的任意信息。事实上,队列本质上是一个无容量限制的buffer。一些生产者向队列中发送消息后,消息消费者就能够从队列中获取消息进行处理。队列可以用如下图表示:
(3) Consuming(消费):消费相当于消息接收(receiving)。通常,消息消费者是一个等待接收消息队列中消息的应用程序。消息消费者用如下图表:
通常,消息生产者、消息消费者和消息中间件通常不在同一台机器上。
一个简单的rabbitmqhelloworld程序
helloword程序主要简单实现消息的发送,接收并打印到屏幕上。实现该功能需要写两个简单程序:一个用于发送消息;一个用于接收消息并打印消息到屏幕上。
如下图所示:
消息生产者发送消息到名为“hello”的消息队列中,消息消费者从该队列中接收消息。
TIPS:
rabbitmq库
Rabitmq实现了AMQP协议。使用rabbit需要导入一些库,这些库也需要像 rabbit一样遵循AMQP协议。每一种语言都会有多种库可供选择。Python语言的实现库主要有:
->Py-amqplib
->txAMQP
->pika
本文档主要使用pika库。安装pythonpika包: $ sudo pip install pika==0.9.8
安装pika 依赖 pip 和git-core包。在安装pika前需要安装这些依赖包。
Ubuntu安装: sudo apt-get install python-pip git-core
Debian安装: apt-get install python-setuptools git-core
sudo easy-install pip
window安装: easy_install pip
pip install pika==0.9.8
消息发送:
本文档通过send.py来完成消息的发送。首先需要建立一个到RabbitMQ 服务的连 接。
上面已经建立了一个到本机中间件的连接。如果中间件服务运行在远程的机器上,只需修改连接参数为远程主机的 ip地址即可。
建立完连接后,还需要确保消息接收队列已存在。如果发送一条消息到一个不存在的位置,rabbitmq 将对发送的消息进行垃圾回收。例如,创建一个名为“hello”的消息队列来接收消息,创建过程如下:
创建完后,就可以开始发送消息了。本例中将发送一条包含一个“hello”字符串的消息到名为“hello”的消息队列中。
在rabbitmq中,消息永远都无法直接发送到消息队列中。总是需要通过exchange,然后发送到消息队列。Exchange的详细介绍将在后面给出。这里只需了解如何使用一个默认的名为空字符串的exchange,这个特定的exchange能够指定我们的消息应该发到哪个消息队列中。消息队列名需要在routing_key参数中指定:
在退出程序前,我们需要确保网络缓存被刷清,并且消息被发送到rabbitmq。然后我们才关闭连接。
TIPS: 消费发送过程无法完成
如果你第一次使用rabbitmq,当看到消息无法发送且不知道为何出错时。也许你需要检测你的消息中间件启动时是否有足够的磁盘空间(默认需要至少1G空间)。空间太少可能导致消息中间件拒绝接收消息。检测中间日志发现确实是空间少后,可以减少磁盘空间限制。配置文件文档中详细说明了如何通过设置disk_free_limit来减少磁盘空间的限制。
消息接收:
本文档通过receive.py来完成消息队列中消息的接收并输出显示出来。同样,首先需要连接到rabbitmq server。连接方法如上。然后确保消息队列已经存在。通过queue_declare 方法可以创建消息队列。他们可以多次执行该方法。但只有第一次执行时才会创建。
也许你会问为什么我们在前面执行过该方法,为什么还需再次调用该方法呢?如果你能确定以及执行过该方法,那么就可以不用重复执行。但如果我们不确定是否执行过该方法时。在多个程序中重复调用该方法来确保消息队列已经存在也不失为一种好的解决方法。
TIPS:想要查看哪些rabbitMQ已经存在和消息队列中有多少消息。可以通过rabbitmqctl 工具查看:
从消息队列中接收消息稍微复杂些。其通过预先在消息队列中声明一个回调函数callback来完成。当我们接收一条消息后,回调函数将会被pika库调用。回调函数函数体可以将相应的内容显示在屏幕上:
然后,我们需要通知rabbitmq特定的回调函数来接收来自“hello”消息队列中的消息:
在通知rabbitmq之前,我们也需要确保消息队列已经存在。这在我们之前调用queue_declare函数后就已经完成了该确认工作。No_ack参数在后面会详细介绍。
最后我们将进入通过一个循环来等待接收数据并在需要时运行回调函数(即收到消息后):
rabbitmq 入门基础(一)