MQ全称为Message Queue 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。这样发布者和使用者都不用知道对方的存在。
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
消息队列可以简单理解为:把要传输的数据放在队列中。
二、为什么要用消息队列消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。
通过下面的外面系统推送信息的例子可以更好的理解一下什么是消息队列和其用法。
RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
rabbitMQ是一款基于AMQP协议的消息中间件,它能够在应用之间提供可靠的消息传输。在易用性,扩展性,高可用性上表现优秀。使用消息中间件利于应用之间的解耦,生产者(客户端)无需知道消费者(服务端)的存在。而且两端可以使用不同的语言编写,大大提供了灵活性。
官方文档:RabbitMQ tutorial - "Hello world!" — RabbitMQ
3.1 RabbitMQ的安装:详见博文:RabbitMQ介绍及下载安装详解_IT之一小佬的博客-CSDN博客
3.2 RabbitMQ的简单使用模式在python中调用rabbitmq的时候需要使用pika库,当然了还有另外的一个库。
pika库安装:
pip install pika
生产者模式:
示例代码:
import pika
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
# 2.创建队列
channel.queue_declare(queue='hello')
# 3.向指定队列插入数据
channel.basic_publish(exchange='', # 简单模式
routing_key='hello', # 指定队列
body='Hello World!') # 向队列中添加的数据
print(" [x] Sent 'Hello World!'")
运行结果:
消费者模式:
示例代码:
import pika
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
# 2.创建队列
# 注意:这一步不是必须的,但是如果消费者先启动而不是生成者先启动时,这时队列中还没有hello队列,这时就会报错
channel.queue_declare(queue='hello')
# 3.确定回调函数
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
# 4.确定监听队列参数
channel.basic_consume(queue='hello',
auto_ack=True, # 默认应答
on_message_callback=callback)
print(' [*] Waiting for messages. To exit press CTRL+C')
# 5.正式监听
channel.start_consuming()
运行结果:
注意:生产者和消费者哪个程序先运行是不受影响的
打开rabbitMQ可视化控制平台:http://192.168.124.104:15672/