MQ是什么?

消息队列概述

消息队列,也成为“消息中间件”。消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
    消息队列是一种应用间的异步协作机制,同时消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。

各种消息队列产品比较

  1. ActiveMQ: ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。它是一个完全支持JMS规范的的消息中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎!
  2. Kafka:Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
  3. RocketMQ: RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
  4. RabbitMQ: RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在,其次,RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。

消息队列功能

优点

1,异步处理提供系统性能(流量削峰,减少响应时间)
2,降低系统耦合性
3,数据分发

缺点

1,系统可用性降低:系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。如何保证MQ的高可用?见问题4
2,系统复杂度升高:MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。
怎么处理消息丢失情况(问题5)?如何保证消息没有被重复消费(问题6)?那么保证消息传递的顺序性(问题7)?
3,一致性问题:A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。如何保证消息数据处理的一致性?
4,如何保证消息的可用性?
保证消息队列的高可用, 集群。RabbitMQ集群分为普通集群和镜像集群
普通集群: 创建的Queue只会放在一个RabbitMQ上,其他实例都同步元数据,如果实际数据宕机,元数据无法访问实际数据,其他实例也就无法同步,他并不能做到高可用,只不过是对Quene中信息,进行备份,缓解访问压力
镜像集群: 每次生产者写消息到queue的时候,都会自动把消息同步到多个实例的queue上,每个RabbitMq节点上都有Queue的消息数据和元数据,某一个节点宕机,其他节点依然保存完整数据,不影响客户端消费,类似于redis中的哨兵模式

上面说的是rabbitMQ集群 ,那RocketMQ如何保证高可用呢?采用双主双从模式。
5,如何保证消息不回丢失?

  • 情况1:消息生产者没有成功发送到MQ?
    消息发送者在发送消息到MQ后,MQ需要给发送者确认收到
  • 情况2:MQ收到消息后, 发生了宕机,导致内存数据丢失。
    MQ收到消息后进行持久化存储即可。
  • 情况3:消费者收到消息,但是没处理完就出现异常导致消息丢失?
    消费者收到消息且处理完后,要手动ACK确定,不要自动ACK确认,确认后MQ才能删除持久化消息。
    6,如何保证消息不被重复消费(即保证消息消费的幂等性)?
    根本原因是: 网络不可达,
    1):发送消息重复:当生产者发送消息给MQ的时候,中途出现网络抖动等原因导致,MQ对发送者应答失败,则发送者会再次发送消息给MQ。这个时候MQ则收到了两个甚至更多相同的消息。
    2):消费消息重复:当消费方在处理消息完毕后,给MQ回复的时候,因为网络问题导致回复失败。则MQ会继续讲消息投递给消费方,从而导致消费方处理了两条相同消息。
    解决办法:
    消息发送者在发送消息的时候带一个全局唯一Id,这样MQ再收到消息的时候去根据id到redis/db中查找记录,如果有则抛弃消息,无则正常存储即可。消费者也是一样的。
    7,如何保证消息消费的顺序性?
      消息有序指的是可以按照消息的发送顺序来消费为全局顺序消息和局部顺序消息,常见的是局部顺序消息,
        RabbitMQ是全局顺序消息 :生产者:MQ:消费者=1:1:1。这种消费能保证消息顺序到达MQ,也可以保证消息顺序消费。但是,他的吞吐量会下降,容错性降低,全局的顺序消费,不常见。
        RocketMQ: 局部顺序消费:
        1.生产者根据消息ID将同一组消息发送到一个Queue中。
        2.多个消费者同时获取Queue中的消息进行消费。
        3.MQ使用分段锁保证单个Queue中的有序消费
    8,大量消息堆积怎么处理?‘
        消费方出先问题(网路故障或者消费者没有给MQ Server正常回答)导致消息没有正常消费。
        解决办法:1,检查消费者并修复问题。2,讲堆积的消息转存到更大的MQ集群。3,增加多个消费节点并行处理堆积消息,等消息处理完毕后再恢复原始架构。
    9,消息过期了怎么处理?消息如果设置了过期时间,且超时未被消费则消息过期,。
        消息过期的处理方案:设置死信队列接受过期消息,2,启动专门消费者处理死信队列的消息,3,也可以查询数据库消息日志,重新发送消息到MQ。

kafka

  • Kafka搭建:https://blog.csdn.net/u011109589/article/details/124920047
  • Zookeeper搭:https://blog.csdn.net/u011109589/article/details/124907414
  • SpringBoot集成Kafka:https://blog.csdn.net/u011109589/article/details/124907414
  • 工作原理:https://blog.csdn.net/swimming_in_IT_/article/details/129797254
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值