文档章节

RabbitMQ(python实现)学习之一:简单两点传输“Hello World”的实现

Airship
 Airship
发布于 2016/03/16 22:10
字数 1684
阅读 102
收藏 2

一.基本配置

注意 RabbitMQ支持python、Java、Ruby、PHP、C#等语言的支持,本博客主要是针对python讲解。本博客安装配置是基于ubuntu系统的。

1.1安装配置epel源

$ rpm -Uvh http://dl.fedoraproject.org/pub/ ... ease-6-8.noarch.rpm

1.2安装erlang

$: yum -y install erlang  或者

$:sudo apt-get install erlang

1.3安装rabbitmq-server

$: yum -y install rabbitmq-server 或者

$: sudo apt-get install rabbitmq-server

1.4启动/停止rabbitmq-server

$: sudo service rabbitmq-server start

$: sudo service rabbitmq-server stop

1.5安装RabbitMQ libraries

RabbitMQ遵循AMQP协议,为了使用rabbitmq,你需要一个库来解读这个协议,对于python来说,你需要安装下面库函数中的任意一个即可:

>py-amqplib>txAMQP>pika

本博文以pika库为例,安装如下:

$:sudo pip install pika==0.9.8 或者
$:sudo apt-get install pika==0.9.8

注意:以下内容是在rabbitmq-server启动,运行在标准端口5672的前提下进行的。 

二.对英文版的翻译

2.1简介

RabbitMQ相当于一个消息代理,他完成接收和转发消息的功能,你可以把它想成一个邮局,起到中转作用。RabbitMQ会用到一些专业术语,如下:

>Producer:用来发送消息的程序被称为一个producer,我们用‘P’表示:

                                     

 >Queue:队列,相当于邮箱的作用,他在创建后一直存活与RabbitMQ中,虽然消息可以在你的程序之间流动,但是在这中间的过程中,消息必须存在queue中,一下queue没有大小限制,你可以存无数的消息,(前提你必须预留1GB的硬盘空间),他就相当于一个没有限制的缓存。多个Producer可以发送消息到同一个queue,多个Consumer也可以从同一个queue中接收消息。一个queue可以用下面的图表示,图的上面是queue的名字。

                             

 

>Consumer:一个用来接收消息的程序称之为Consumer,我们用下面的图表示:

                                 

注意,对于Producer和Consumer可以不在同一台host上面,后续博文会做介绍。

2.2两点传输“Hello World!”

需要两个程序,一个用来发送“Hello World!”,一个程序用来接收“Hello World!”并打印到屏幕上面。模型如下:

                        

我们创建一个名字为hello的queue。Producer发送消息到hello的queue,Consumer从名为hello的queue中接收消息。

2.3sending(发送代码实现)

模型如下:

                                

首先我们需要编写一个send.py程序,这个程序将向queue中发送一个消息,第一件事,我们要做的就是与rabbitmq-server建立连接,代码如下:

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

如果我们想与不同的host建立连接,只需将‘localhost’换成IP地址。

 

接下来,我们需要确定接纳消息的queue的存在,如果我们把消息发送给不存在的queue,那么rabbitmq自动将消息丢弃,让我们创建一个消息队列queue,命名为‘hello’

channel.queue_declare(queue='hello')

 

在Rabbitmq中,一个消息不能直接发送给queue,需要经过一个exchange,后续博文会讲到,现在我们只需将exchange设置为空字符串。

exchange很特别,他会识别我们的消息要发送给哪个消息队列queue,queue的名字需要用routing_key来标识,exchange通过routing_key确定消息发送至哪个消息队列queue。代码如下:

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

在退出程序之前,我们需要清理缓存,并且确定我们的消息“Hello World!”真的发送给RabbitMQ了,我们可以通过关闭连接来完成,代码如下:

connection.close()

完整的send.py的代码如下:

复制代码

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()

复制代码

2.4Receiving(接收代码实现)

模型如下所示:

                            

我们的接收程序receive.py将接收消息,并将它打印在屏幕上。

同样首先,我们需要与rabbitmq-server建立连接,代码和send.py基本一致,代码如下:

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

接下来,和前面一样,要确定去队列queue的存在,用queue_declare()创建队列,对于这个命令我们可以运行很多次,但只有一个名字为hello的queue存在。代码如下:

channel.queue_declare(queue='hello')

或许你会问,为什么我们要再次创建名字为hello的queue,前面我们已经建立了啊,当然,如果我们确定队列queue已经存在了,我们可以不 加这段代码。例如,如果send.py程序在之前已经运行过了,但是我们不确定哪个程序时先运行的,这时候,我们在两个程序中同时声明queue就是必须 的。

 

对于receive.py,我们要定义一个callback函数,在我们接受到消息的时候,pika库会调用callback函数,在我们的程序里,callback函数就是将接收到的消息打印在屏幕上。函数代码如下:

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

 

接下来我们需要告诉Rabbitmq,这个特殊的函数callback()的功能,就是从hello的queue中接收消息,代码如下:

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

对于代码中的 no_ack,后续的博客会提到。

最后,我们开启一个永不停止的线程来等待消息,在需要的时候运行callback()函数。代码如下:

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

完整的receive.py的代码如下:

复制代码

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] Received %r" % (body,)

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

channel.start_consuming()

复制代码

2.5代码测试

首先打开一个命令行窗口,运行send.py代码,运行及结果如下:

$ :python send.py
 [x] Sent 'Hello World!'

send.py每次运行完就停止,接下来让我们运行接收的代码receive.py,运行及结果如下:

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

你会看到,received.py运行起来后,不会停止,一直在那等待消息的传入,如果想停止,CTRL+C。

在一个新命令行窗口中继续运行send.py,运行receive.py的命令行窗口会继续输出相应信息。

2.6部分rabbitmq-server的命令行操作命令

1)查看各个queue的名称以及queue中的消息数

$: sudo rabbitmqctl list_queues

例如

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

2)查看各exchange的名称

$: sudo rabbitmqctl list_exchanges

 例如:

复制代码

$ :sudo rabbitmqctl list_exchanges
 Listing exchanges ...
 logs      fanout
 amq.direct      direct
 amq.topic       topic
 amq.fanout      fanout
 amq.headers     headers
 ...done.

复制代码

对于上图中,你会看到很多amq.*的exchange,这些是系统默认建立的,在你不建立exchange时,系统默认建立上面几个。

3)查看binding的名称后续博客会介绍binding)

$: sudo rabbitmqctl list_bindings

分类: openstack, Rabbitmq通信学习


本文转载自:http://www.cnblogs.com/likailiche/p/4509209.html

Airship
粉丝 46
博文 1065
码字总数 21602
作品 0
南京
高级程序员
私信 提问
深入理解RabbitMQ消息队列的使用-张明阳-专题视频课程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a2011480169/article/details/83581214 深入理解RabbitMQ消息队列的使用—126人已学习 课程介绍 RabbitMQ使用...

安静的技术控
2018/06/21
0
0
RabbitMQ使用篇一(C#语言介绍)

RabbitMQ官网官方介绍: 译文: RabbitMQ是目前部署最广泛的开源消息代理(何为代理?可以理解为一个提供功能服务的中间件)。 在全球范围内的大小企业中的生产环境中,RabbitMQ的部署两已经...

XChao1995
03/18
0
0
PHP版 RabbitMQ官方中文入门教程

工作中用到 RabbitMQ,但是RabbitMQ官方的 Tutorials 是英文Python和Jave的,官网的教程很好,正好最近业余在撸Python,所以直接来搞个PHP版本的,仅供PHP菜鸟一起来入门学习,如有错误和问题...

Yuansir
2013/06/03
10.1K
0
RabbitMQ安装、配置、基本使用

安装 ubuntu下参考:https://www.rabbitmq.com/install-debian.html 启动/关闭: 修改文件打开数量的限制,提高并发性能 命令可查看限制信息: 完成下面的两个步骤,电脑重启才能生效。 1、 ...

樂天
2015/11/10
455
0
python操作rabbitmq操作数据

一、RabbitMQ 消息队列介绍 RabbitMQ也是消息队列,那RabbitMQ和之前python的Queue有什么区别么? 1 2 3 4 5 6 7 8 2)Install RabbitMQ Server 1 2 3)use RabbitMQ Server 1 2 2、基本示例...

数据架构师
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

The POM for xxx is invalid, transitive dependencies (if any) will not be available

The POM for xxx is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details 问题描述 在使用maven打包时,log信息中打印出:[**WARNIN......

lwenhao
39分钟前
6
0
setState() called after dispose() flutter

# 在setState前加入以下判断if (!mounted) return;

zdglf
今天
4
0
docker和docker-compose二种方式安装mysql8.0

Docker方式安装 在命令行下运行 docker run -d -p 3306:3306 --restart always --privileged=true--name mysql-e MYSQL_USER="test" -e MYSQL_PASSWORD="test" -e MYSQL_ROOT_PASSWOR......

小白的成长
今天
9
0
五大网络威胁应对挑战

既然如此,那么威胁的检测和响应过程是否像生产瑞士手表那样高效运行呢?答案远非如此。据ESG报告显示,威胁检测和响应过程充满各种各样的问题。来自372名企业网络安全和IT专家的数据,以下是...

linuxCool
今天
5
0
jQuery 选择器使用大全(标签选择器,ID选择器等)

jQuery的选择器是CSS 1-3,XPath的结合物。jQuery提取这二种查询语言最好的部分,融合后创造出了最终的jQuery表达式查询语言。如果你了解CSS(绝大部分WEB开发者都用到的),那么你学起来就很...

前端老手
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部