分享

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

sstutu 发表于 2015-5-22 19:25:03 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 17013

问题导读

1.什么是RabbitMQ?
2.Queue用来做什么的?
3.用来接收消息的程序被称之为什么?
4.RabbitMQ如何实现简单两点传输“Hello World”的实现?







一.基本配置
注意 RabbitMQ支持python、Java、Ruby、PHP、C#等语言的支持,本博客主要是针对python讲解。安装配置是基于ubuntu系统的。
1.1安装配置epel源
[mw_shl_code=bash,true]rpm -Uvh http://dl.fedoraproject.org/pub/ ... ease-6-8.noarch.rpm[/mw_shl_code]

1.2安装erlang

[mw_shl_code=bash,true]yum -y install erlang[/mw_shl_code]  或者

[mw_shl_code=bash,true]sudo apt-get install erlang[/mw_shl_code]

1.3安装rabbitmq-server
[mw_shl_code=bash,true]yum -y install rabbitmq-server[/mw_shl_code]
或者
[mw_shl_code=bash,true]sudo apt-get install rabbitmq-server[/mw_shl_code]

1.4启动/停止rabbitmq-server
[mw_shl_code=bash,true]sudo service rabbitmq-server start[/mw_shl_code]
[mw_shl_code=bash,true]sudo service rabbitmq-server stop[/mw_shl_code]

1.5安装RabbitMQ libraries

RabbitMQ遵循AMQP协议,为了使用rabbitmq,你需要一个库来解读这个协议,对于python来说,你需要安装下面库函数中的任意一个即可:
[mw_shl_code=bash,true]>py-amqplib
>txAMQP
>pika[/mw_shl_code]
本博文以pika库为例,安装如下:

[mw_shl_code=bash,true]sudo pip install pika==0.9.8[/mw_shl_code] 或者
[mw_shl_code=bash,true]sudo apt-get install pika==0.9.8[/mw_shl_code]

注意:以下内容是在rabbitmq-server启动,运行在标准端口5672的前提下进行的。
二.对英文版的翻译
2.1简介
RabbitMQ相当于一个消息代理,他完成接收和转发消息的功能,你可以把它想成一个邮局,起到中转作用。RabbitMQ会用到一些专业术语,如下:
>Producer:用来发送消息的程序被称为一个producer,我们用‘P’表示:
                                     1.png
>Queue:队列,相当于邮箱的作用,他在创建后一直存活与RabbitMQ中,虽然消息可以在你的程序之间流动,但是在这中间的过程中,消息必须存在queue中,一下queue没有大小限制,你可以存无数的消息,(前提你必须预留1GB的硬盘空间),他就相当于一个没有限制的缓存。多个Producer可以发送消息到同一个queue,多个Consumer也可以从同一个queue中接收消息。一个queue可以用下面的图表示,图的上面是queue的名字。
                              2.png

>Consumer:一个用来接收消息的程序称之为Consumer,我们用下面的图表示:
                                  3.png
注意,对于Producer和Consumer可以不在同一台host上面,后续博文会做介绍。
2.2两点传输“Hello World!”
需要两个程序,一个用来发送“Hello World!”,一个程序用来接收“Hello World!”并打印到屏幕上面。模型如下:
                         4.png
我们创建一个名字为hello的queue。Producer发送消息到hello的queue,Consumer从名为hello的queue中接收消息。
2.3sending(发送代码实现)
模型如下:
                                 5.png
首先我们需要编写一个send.py程序,这个程序将向queue中发送一个消息,第一件事,我们要做的就是与rabbitmq-server建立连接,代码如下:

[mw_shl_code=python,true]import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()[/mw_shl_code]

如果我们想与不同的host建立连接,只需将‘localhost’换成IP地址。
接下来,我们需要确定接纳消息的queue的存在,如果我们把消息发送给不存在的queue,那么rabbitmq自动将消息丢弃,让我们创建一个消息队列queue,命名为‘hello’
[mw_shl_code=bash,true]channel.queue_declare(queue='hello')[/mw_shl_code]

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

exchange很特别,他会识别我们的消息要发送给哪个消息队列queue,queue的名字需要用routing_key来标识,exchange通过routing_key确定消息发送至哪个消息队列queue。代码如下:
[mw_shl_code=bash,true]channel.basic_publish(exchange='',routing_key='hello',body='Hello World!')
print "[X] Sent 'Hello World!'"[/mw_shl_code]
在退出程序之前,我们需要清理缓存,并且确定我们的消息“Hello World!”真的发送给RabbitMQ了,我们可以通过关闭连接来完成,代码如下:
[mw_shl_code=bash,true]connection.close()[/mw_shl_code]

完整的send.py的代码如下:
[mw_shl_code=python,true]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()[/mw_shl_code]

2.4Receiving(接收代码实现)
模型如下所示:
                            6.png
我们的接收程序receive.py将接收消息,并将它打印在屏幕上。
同样首先,我们需要与rabbitmq-server建立连接,代码和send.py基本一致,代码如下:
[mw_shl_code=python,true]import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel=connection.channel()[/mw_shl_code]

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

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



对于receive.py,我们要定义一个callback函数,在我们接受到消息的时候,pika库会调用callback函数,在我们的程序里,callback函数就是将接收到的消息打印在屏幕上。函数代码如下:
[mw_shl_code=python,true]def callback(ch,method,properties,body):

    print"[x] Received %r" %(body)[/mw_shl_code]

接下来我们需要告诉Rabbitmq,这个特殊的函数callback()的功能,就是从hello的queue中接收消息,代码如下:
[mw_shl_code=python,true]channel.basic_consume(callback,queue='hello',no_ack=True)[/mw_shl_code]

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

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

[mw_shl_code=python,true]print '
  • Waiting for message. To exit press CTRL+C'

    channel.start_consuming()[/mw_shl_code]
  • 完整的receive.py的代码如下:
    [mw_shl_code=python,true]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()[/mw_shl_code]

  • 2.5代码测试

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

    [x] Sent 'Hello World!'[/mw_shl_code]

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

    [mw_shl_code=python,true]python receive.py

  • Waiting for messages. To exit press CTRL+C

    [x] Received 'Hello World!'[/mw_shl_code]
  • 你会看到,received.py运行起来后,不会停止,一直在那等待消息的传入,如果想停止,CTRL+C。

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

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

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

    [mw_shl_code=python,true]$: sudo rabbitmqctl list_queues[/mw_shl_code]
    例如
    [mw_shl_code=python,true] sudo rabbitmqctl list_queues

    Listing queues ...

    hello    0

    ...done.[/mw_shl_code]
    2)查看各exchange的名称
    [mw_shl_code=python,true]$: sudo rabbitmqctl list_exchanges[/mw_shl_code]

    例如:
    [mw_shl_code=python,true]$ :sudo rabbitmqctl list_exchanges

    Listing exchanges ...

    logs      fanout

    amq.direct      direct

    amq.topic       topic

    amq.fanout      fanout

    amq.headers     headers

    ...done.[/mw_shl_code]

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

    3)查看binding的名称(后续博文会介绍binding)
    [mw_shl_code=python,true]$: sudo rabbitmqctl list_bindings[/mw_shl_code]


    欢迎加入about云群425860289432264021 ,云计算爱好者群,关注about云腾讯认证空间

    没找到任何评论,期待你打破沉寂

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐上一条 /2 下一条