设为首页 收藏本站
查看: 879|回复: 0

[经验分享] RabbitMQ(python实现)学习之一:简单两点传输“Hello World”的实现

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-29 11:45:56 | 显示全部楼层 |阅读模式
  一.基本配置
  注意 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’表示:
                                       DSC0000.png
  >Queue:队列,相当于邮箱的作用,他在创建后一直存活与RabbitMQ中,虽然消息可以在你的程序之间流动,但是在这中间的过程中,消息必须存在queue中,一下queue没有大小限制,你可以存无数的消息,(前提你必须预留1GB的硬盘空间),他就相当于一个没有限制的缓存。多个Producer可以发送消息到同一个queue,多个Consumer也可以从同一个queue中接收消息。一个queue可以用下面的图表示,图的上面是queue的名字。
                                DSC0001.png
  
  >Consumer:一个用来接收消息的程序称之为Consumer,我们用下面的图表示:
DSC0002.png
  注意,对于Producer和Consumer可以不在同一台host上面,后续博文会做介绍。
  2.2两点传输“Hello World!”
  需要两个程序,一个用来发送“Hello World!”,一个程序用来接收“Hello World!”并打印到屏幕上面。模型如下:
DSC0003.png
  我们创建一个名字为hello的queue。Producer发送消息到hello的queue,Consumer从名为hello的queue中接收消息。
  2.3sending(发送代码实现)
  模型如下:
DSC0004.png
  首先我们需要编写一个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(接收代码实现)
  模型如下所示:
DSC0005.png
  我们的接收程序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

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144884-1-1.html 上篇帖子: 解释型语言和编译型语言的不同以及Python如何运行 下篇帖子: Python开发入门与实战4-模板页面
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表