了解RabbitMQ

消息队列可以实现流量削峰、降低系统耦合度、提高系统性能等。

RabbitMQ是一个实现了AMQP协议(Advanced Message Queue Protocol)的消息队列。

RabbitMQ中的概念

  • producer: producer 是一个发送消息的应用
  • exchange:producer 并不会直接将消息发送到 queue 上,而是将消息发送给 exchange,由 exchange 按照一定规则转发给指定queue
  • queue: queue 用来存储 producer 发送的消息
  • consumer: consumer是接收并处理消息的应用

 

我们将用Python编写两个小程序; 发送单个消息的生产者(发送者)和接收消息并将其打印出来的消费者(接收者)。 这是消息传递的“Hello World”。

在下图中,“P”是我们的生产者,“C”是我们的消费者。 中间的框是一个队列 - RabbitMQ代表消费者保留的消息缓冲区。

 

示例:

#!/usr/bin/env python
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
#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()


channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
receive.py

 

RabbitMQ运作原理

RabbitMQ消息传递(单个队列):

RabbitMQ消息传递(多个队列):

 

多个Queue的场景中,消息会被Exchange按一定的路由规则分发到指定的Queue中去:

    • 生产者指定Message的routing key,并指定Message发送到哪个Exchange
    • Queue会通过binding key绑定到指定的Exchange
    • Exchange根据对比Message的routing key和Queue的binding key,然后按一定的分发路由规则,决定Message发送到哪个Queue

每一类Exchange都有自己的分发路由规则:

Fanout Exchange:忽略key对比,发送Message到Exchange下游绑定的所有Queue

Direct Exchange:比较Message的routing key和Queue的binding key,完全匹配时,Message才会发送到该Queue

Topic Exchange:比较Message的routing key和Queue的binding key,按规则匹配成功时,Message才会发送到该Queue

 默认Exchange:比较Message的routing key和Queue的名字,完全匹配时,Message才会发送到该Queue

 

消息投递策略

默认情况下RabbitMQ的队列和交换机在RabbitMQ服务器重启之后会消失,原因在于队列和交换机的durable属性,该属性默认情况下为false.

能从AMQP服务器崩溃中恢复的消息称为持久化消息,如果想要从崩溃中恢复那么消息必须

  • 投递模式设置2,来标记消息为持久化
  • 发送到持久化的交换机
  • 到到持久化的队列

缺点:消息写入磁盘性能差很多。除非特别关键的消息会使用

 

消费端限流

假设MQ服务器上面囤积了成千上万条的消息的时候,这个时候突然连接消费端,那么巨量的消息全部推过来,但是客户端无法一次性处理这么多的数据。

在高并发的时候,瞬间产生的流量很大,消息很大,而MQ有个重要的作用就是限流,限流则是消费端做的。

RabbitMQ提供了一种Qos(服务质量保证)功能,即在非自动确认消息的前提下,在一定数量的消息未被消费前,不进行消费新的消息。

posted @ 2019-03-03 02:35  rayh  阅读(152)  评论(0编辑  收藏  举报