什么是MQ
- 一种通信方式有(同步通信与异步通信)
同步通信:比如微信视频聊天实时返回信息局限只能和一个人
异步通信:比如微信聊天一个人可以和多个聊天局限调用链关系不清晰 - 事件驱动
异步方式中大量请求进入broker进行缓存有服务原则性订阅消息,优点0耦合度、吞吐量高、故障隔离、流量削峰
MQ:
message Queue
翻译为消息队列
,通过典型的生产者和消费者模型不断向消息队列中生产消息,消费者不断从队列中获取消息。因为消息的生产和消费都是一部的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现了 系统之间的解耦。别名是消息中间件,通过利用高效的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
Rabbitmq的六种模式
Rabbitmq的六种模式分别为:simple简单模式、work工作模式、publish/subscribe订阅模式、routing路由模式、topic 主题模式、RPC模式
simple简单模式为一个队列中一条消息,只能被一个消费者消费。Work工作模式为一个生产者,多个消费者,每个消费者获取到的消息唯一。publish/subscribe订阅模式为一个生产者发送的消息被多个消费者获取。routing路由模式为生产者发送的消息主要根据定义的路由规则决定往哪个队列发送。topic 主题模式为生产者,一个交换机(topicExchange),模糊匹配路由规则,多个队列,多个消费者。RPC模式为客户端 Client 先发送消息到消息队列,远程服务端 Server 获取消息,然后再写入另一个消息队列,向原始客户端 Client 响应消息处理结果。
MQ有哪些种类
当今市场上有很多主流的消息中间件,如
ActiveMQ
、RabbitMQ
,比较火的Kafka
,阿里巴巴开发的RocketMQ
等。
MQ 之间的对比
ActiveMQ
ActiveMQ是Apache出品的,能力强劲的开源消息总线,它是一个完全支持JMS规范的消息中间件,丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的MQ。
Kafka
Kafka是LinkedIn开源的分布式消息订阅系统,目前归属Apache顶级开源项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是
用于日志的收集和传输,适合于大数据的互联网的数据收集业务。
RocketMQ
RocketMQ是阿里巴巴开源的消息中间件,他是纯Java开发,具有高吞吐量,高可用,适合大规模分布式系统应用的特点,RocketMQ思路起源于Kafka,但并不是Kafka的复制,他对消息的可靠村塾以及事务做了优化,目前在阿里集团被广泛使用。
RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列的系统,基于AMQP的主要特征是面向消息队列、路由、可靠性、安全。
什么是AMQP协议
AMQP
为消息定义了线路层(wire-level
protocol)的协议,而JMS所定义的是API规范。JMS的API协议能够确保所有的实现都能通过通用的API来使用,但是并不能保证某个JMS实现所发送的消息能够被另外不同的JMS实现所使用。而AMQP的线路层协议规范了消息的格式,消息在生产者和消费者间传送的时候会遵循这个格式
。这样AMQP在互相协作方面就要优于JMS——它不仅能跨不同的AMQP实现,还能跨语言和平台。
五种模式
- BasicQueue
- WorkerQueue
- direct交换器相对来说比较简单,匹配规则为:如果路由键匹配,消息就被投送到相关的队列。
- fanout交换器中没有路由键的概念,他会把消息发送到所有绑定在此交换器上面的队列中。
- topic交换器你采用模糊匹配路由键的原则进行转发消息到队列中。
高阶篇
消息可靠性:发送消息确保消费保证消费者能消费
延迟消息问题:具有延迟特性
消息堆积问题:高并发是消息存储过多
高可用问题:避免单点故障导致不可用采用集群搭建模保证数据统一性
- 消息可靠性
全局唯一id保证区分不同的消息
生产端发布消息和routingKey,经由交换器,依据routingKey,到达指定队列。队列投递消息到已经订阅此消息的消费者。
- 消费者确认机制
– 消费者拿到消息像MQ发送ack
回执,MQ
收到ack
后删除消息,出异常返回nck会将消息重新投递到消费者
自动
会导致循环反复投递所以这里采取Spring的retry机制,在消费者出现异常时利用本地重试
重试机制入侵性强导致消息丢失接下采用消息处理策略
– 解决方法:创建两个用于异常失败信息的交换机和队列用于存储失败的消息
@Bean
public MessageRecoverer republishMessageRecoverer(RabbitTemplate rabbitTemplate){
return new RepublishMessageRecoverer(rabbitTemplate,RabbitMqConfig.ERROREXCHANGES,RabbitMqConfig.ROUTINGKE3);
}
-
死信交换机
机制
:设置队列延迟投递消息转发到死信交换机通过routingkey绑定到死信队列等待消费者订阅消息
-
惰性队列 lazy queue
机制
:用于处理消息堆积问题既(当生产者发送消息速度超过消费者处理的速度)
MQ在内存存储百分之40 满了会间歇性暂停导致并发波动,惰性队列会将数据写入磁盘,磁盘空间大读写慢基于磁盘IO
可以在运行中声明一个惰性队列,也可以建立一个新的惰性队列
-
MQ集群
*我试着把你忘记 可在夜里总想你 *