基本概念
RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。
关于python的queue介绍
关于python的队列,内置的有两种,一种是线程queue,另一种是进程queue,但是这两种queue都是只能在同一个进程下的线程间或者父进程与子进程之间进行队列通讯,并不能进行程序与程序之间的信息交换,这时候我们就需要一个中间件,来实现程序之间的通讯。
轮询消费模式
发送队列的一方把消息存入mq的指定队列后,若有消费者端联入相应队列,即会获取到消息,并且队列中的消息会被消费掉。
若有多个消费端同时连接着队列,则会已轮询的方式将队列中的消息消费掉。
send端(生产者)
#coding:utf-8
import pika
# 创建凭证,使用rabbitmq用户密码登录
#credentials = pika.PlainCredentials("dalu","123345")
# 新建连接,这里localhost可以更换为服务器ip
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))#,credentials=credentials
# 创建连接
channel = connection.channel()
# 声明一个队列,用于接收消息,队列名字叫“hello”,
# durable=True队列持久化:rabbitmq服务器挂了数据不会丢失。(可以不加)
channel.queue_declare(queue="hello",durable=True)
# 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),
#初学可以使用空字符串交换(exchange=''),
#它允许我们精确的指定发送给哪个队列(routing_key=''),
#参数body值发送的数据
channel.basic_publish(
exchange='',
routing_key='hello',
body='hello_word',
properties=pika.BasicProperties(delivery_mode=2#消息持久化:rabbitmq服务器挂了数据不会丢失。
)
)
print('已经发送')
# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接
connection.close()
receive端(消费者)
#coding:utf-8
import pika
# 建立与rabbitmq的连接
#credentials = pika.PlainCredentials("dalu","123456")
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))#,credentials=credentials
channel = connection.channel()
channel.queue_declare(queue='hello',durable=True)
def callback(ch,method,properties,body):
print("消费者接收到了任务:%r"%body.decode("utf8"))
#手动和服务器确认收到消息了
ch.basic_ack(delivery_tag=method.delivery_tag)
"""
消息公平分发
如果Rabbit只管按顺序把消息发到各个消费者身上,不考虑消费者负载的话,很可能出现,一个机器配置不高的消费者那里堆积了很多消息处理不完,
同时配置高的消费者却一直很轻松。为解决此问题,
各个消费者端,配置perfetch=1,意思就是告诉RabbitMQ在我这个消费者当前消息还没处理完的时候就不要再给我发新消息了。
"""
channel.basic_qos(prefetch_count=1)
# 有消息来临,立即执行callbak,没有消息则夯住,等待消息
channel.basic_consume(on_message_callback=callback,queue="hello",)
# 开始消费,接收消息
channel.start_consuming()