消息队列RabbitMQ常用技术解析

什么是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有哪些种类

当今市场上有很多主流的消息中间件,如ActiveMQRabbitMQ,比较火的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,到达指定队列。队列投递消息到已经订阅此消息的消费者。
    -- Rabbitmq提供了publisher confirm机制来避免消息发送到MQ过程中丢失。
    在这里插入图片描述
  • 消费者确认机制
    – 消费者拿到消息像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集群

在这里插入图片描述

*我试着把你忘记 可在夜里总想你 *

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值