目录
一、MQ的介绍
1.消息队列(管道)
先进先出的队列,队列中存放的是消息数据,主要是为了不同进程间的通信。
不使用消息队列,则进程间在传递消息时的耦合太高了,改动一个进程,另一个必须血要更改了,采用消息中间件,则可以避免此问题的发生。
生产者发送消息到消息中兴,消费者从消息中心取消息。
2.消息的两种分发机制
(1)轮询分发:每个消费者获得相同的消息数量,而不用考虑每个消息的任务时长
(2)公平分发:避免“忙的忙死,闲的闲死”保证每个都是正常的消费。
--公平分发的限制机制使用basicQos( prefetchCount = 1)方法,来限制RabbitMQ只发不超过1条的消息给同一个消费者。当消息处理完毕后,有了反馈,才会进行第二次发送。)
---使用公平分发,必须关闭自动应答,改为手动应答。
3.消息的确认模式
服务端获取消息是否被消费;
(1)自动确认:只要消息从队列中被消费者获取,无论消费者获取到消息后是否成功消费,都认为是消息已经成功消费。
(2)手动确认:消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。
二、RabbitMQ的介绍
1.RabbitMQ
是实现MQ众多实现中的一种。RabbitMQ是基于AMQP实现的,服务器使用Erlang写的,客户端则支持多种语言。
2.AMQP
高级消息队列协议,应用层开放标准,为面向消息的中间件设计;
消息中间件用于组件之前的解耦,消息发送者将消息发送给中间件,消息接收者从中间件接收消息,两者不必互相彼此知道。
3.基本对象
(1)Connection:是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑
(2)ConnectionFactory:ConnectionFactory为Connection的制造工厂
(3)Channel:Channel是我们与RabbitMQ打交道的最重要的一个接口
(4)Queue:内部对象,用于存储消息,可分为:
注:P生产消息并最终投递到Queue中,消费者C从Queue中获取消息并消费。
(5)Message acknowledgment:消息回执,用于解决宕机时,消息没有被处理完成丢失的情况,消费者消费之后发送回执RabbitMQ,RabbitMQ收到之后然后从queue中删除此消息。如果RabbitMQ没收到,则将消息发给其他消费者处理。
(6)Message durability:消息持久化,降低消息丢失的可能性
(7)Prefetch count:生产者消费者一对多时,限定每个消费者处理的消息数,保证一个处理完成之后再处理下一个,避免产生某个消费者的消息数产生积压。
(8)Exchange:生产者进行消息投递时,先将消息发送到交换器,然后由交换器将消息路由到多个queue中
(9)Binding key:指定当前Exchange下,什么样的RoutingKey会被下派到当前绑定的Queue中。
(10)Exchange Types:消息投递机制类型
---- fanout:把所有发送到该Exchange的消息路由到所有与它绑定的Queue中
---- direct:把消息路由到那些binding key与routing key完全匹配的Queue中
---- topic
---- headers
三、使用python向RabbitMQ发送消息
使用pika给rabbitMQ发送消息队列方法:
(1)创建PlainCredentials实例
(2)创建Connection对象
(3)使用Connection的实例创建channel
(4)使用Connection的实例声明 (queue_declare)
(5)使用Connection的实例发布消息 (basic_publish)
(6)关闭链接
<待后续补充...>