消息队列,AMQP 与 RabbitMQ(一) – Hello world

这是什么

RabbitMQ 是一个持久化队列,用于实现异步处理的事件机制。

简单来说,叫做“吃不了兜着走”,有时候有些任务可能会发生产生任务的速度高于处理任务的速度的情况,为了不让并发的任务处理程序卡死,这时候就需要将产生的任务存放起来,让任务的处理器能够按照自己的节奏处理任务。

简单而言如此,专业一点来说,这就是 AMQP 百度百科 wikipedia 的概念。

AMQP 是一个开放标准的应用层协议,用于面向消息的中间件。定义的标准是:面向消息、队列、路由(包括点对点的和发布订阅的)、可靠性以及安全性。

RabbitMQ 是一个实现了 amqp 协议的服务,可以通过下面这篇中文文章来先大概了解梗概:

http://blog.csdn.net/whycold/article/details/41119807

好吧,那我们现在知道了下面几个最最基本概念:

  • Queue: 队列
  • Producer: (消息的)生产者
  • Consumer: (消息的)消费者
  • Exchange: 交换器

然后我们用一句话说明它们之间的关系:生产者通过交换器将消息分发到不同的队列中持久化存放,消费者则侦听队列,异步从队列中取出消息进行处理。

逐步由这些概念开始,我们由浅入深来过一下 RabbitMQ 官网教程

The tutorial

1. Hello world

先安装好 RabbitMQ,ampq 的 server 端程序。

apt-get install rabbitmq-server

暂时不需要做任何配置。

然后安装 pika (一个 python 下 ampq 协议的 client 库)。

pip3 install pika

然后我们两段 python 程序,先是生产者 Producer send.py,负责发送消息(纯文本 )到一个指定的队列 hello 中:

#!/usr/bin/env python
# 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()

每执行一次这个程序,send.py 就会将一个 内容为 Hello World! 的消息发送到队列中:

python-one-overall

然后是 receive.py 来作为队列的消费者,来侦听处理这个队列的消息:

#!/usr/bin/env python
# revceive.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()

通过这个命令可以查看队列的列表和状态:

$ sudo rabbitmqctl list_queues

【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2015/11/amqp-rabbitmq-1.html【消息队列,AMQP 与 RabbitMQ(一) – Hello world】

发表评论

电子邮件地址不会被公开。 必填项已用*标注