消息队列

MQ 定义

message queue 消息队列的目的是为了实现各个APP之间的通信,APP基于MQ实现消息的发送和接受从而实现应用程序之间的通信,这样多个应用程序可以运行在不同的主机上,通过MQ就可以实现跨网络通信,因此MQ实现了业务的解耦和异步机制

MQ 特点

消息队列作为高并发系统核心组件之一,能够帮助业务系统结构提升开发效率和系统稳定性

核心特点

流量削峰

  • 主要解决瞬时写压力大于应用服务的处理能力而导致消息丢失、系统崩溃等问题

系统解耦

  • 一个系统或者模块,调用了多个系统或者模块,它们互相之间的调用非常复杂,并且维护起来很麻烦,但其实这个调用是不需要直接同步调用接口的,如果用MQ给它异步化解耦也是可以的

  • 解决不同重要程度、不同能力级别系统之间依赖导致的数据处理实效不一致从而引起的全部宕机等问题

异步调用

  • 举例:假设有ABCD四个系统,A系统收到一个请求,需要在自己本地写库,还需要往BCD三个系统写库,A系统自己写本地库需要3ms,往其他系统写库相对较慢,B系统200ms ,C系统350ms,D系统400ms,这样算起来,整个功能从请求到响应的时间为3ms+200ms+350ms+400ms=953ms,接近一秒,对于用户来说体验是非常差的,但是如果用了MQ,用户发送请求到A系统耗时3ms,A系统发送三条消息到MQ,假如耗时5ms,用户从发送请求到相应3ms+5ms=8ms,仅用了8ms,用户的体验非常好。

其他特点

提升性能

  • 当存在一对一调用时,可以发一条消息给消息系统,让消息系统通知相关系统

蓄流压测

  • 线上有些链路不好压测,可以通过堆积一定量的消息然后统一放开来进行压测

MQ 缺点

①系统可用性降低:

系统引入的外部依赖越多,系统要面对的风险越高,拿场景一来说,本来ABCD四个系统配合的好好的,没啥问题,但是你偏要弄个MQ进来插一脚,虽然好处挺多,但是万一MQ挂掉了呢,那样你系统不也就挂掉了。

②系统复杂程度提高:

非要加个MQ进来,如何保证没有重复消费呢?如何处理消息丢失的情况?怎么保证消息传递的顺序?问题太多。

③一致性的问题:

A系统处理完再传递给MQ就直接返回成功了,用户以为你这个请求成功了,但是,如果在BCD的系统里,BC两个系统写库成功,D系统写库失败了怎么办,这样就导致数据不一致了。 所以。消息队列其实是一套非常复杂的架构,你在享受MQ带来的好处的同时,也要做各种技术方案把MQ带来的一系列的问题解决掉,等一切都做好之后,系统的复杂程度硬生生提高了一个等级。

MQ 分类

主流消息队列软件:

  • RabbitMQ
  • kafka
  • ActiveMQ
  • RocketMQ

小众消息队列软件:

  • ZeroMQ
  • Apache Qpid

各 MQ 概述

RabbitMQ

单机吞吐量:

  • 万级,吞吐量比RocketMQ和Kafka要低了一个数量级

时效性:

  • 微秒级,这是rabbitmq的一大特点,延迟是最低的

优劣势总结:

  • erlang语言开发,性能极其好,延时很低;吞吐量到万级,MQ功能比较完备而且开源提供的管理界面非常棒,用起来很好用社区相对比较活跃,几乎每个月都发布几个版本分在国内一些互联网公司近几年用rabbitmq也比较多一些但是问题也是显而易见的,RabbitMQ确实吞吐量会低一些,这是因为他做的实现机制比较重。而且erlang开发,国内有几个公司有实力做erlang源码级别的研究和定制?如果说你没这个实力的话,确实偶尔会有一些问题,你很难去看懂源码,你公司对这个东西的掌控很弱,基本职能依赖于开源社区的快速维护和修复bug。而且rabbitmq集群动态扩展会很麻烦,不过这个我觉得还好。其实主要是erlang语言本身带来的问题。很难读源码,很难定制和掌控。

kafka

单机吞吐量:

  • 10万级别,这是kafka最大的优点,就是吞吐量高。在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准

topic数量对吞吐量的影响:

  • topic从几十个到几百个的时候,吞吐量会大幅度下降所以在同等机器下,kafka尽量保证topic数量不要过多。如果要支撑大规模topic,需要增加更多的机器资源

时效性:

  • 延迟在ms级以内

优劣势总结:

  • kafka的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展同时kafka最好是支撑较少的topic数量即可,保证其超高吞吐量而且kafka唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略这个特性天然适合大数据实时计算以及日志收集

ActiveMQ

单机吞吐量:

  • 万级,吞吐量比RocketMQ和Kafka要低了一个数量级

时效性:

  • ms级

优劣势总结:

  • 非常成熟,功能强大,在业内大量的公司以及项目中都有应用偶尔会有较低概率丢失消息而且现在社区以及国内应用都越来越少,官方社区现在对ActiveMQ 5.x维护越来越少几个月才发布一个版本而且确实主要是基于解耦和异步来用的,较少在大规模吞吐的场景中使用

RocketMQ

单机吞吐量:

  • 10万级,RocketMQ也是可以支撑高吞吐的一种MQ

topic数量对吞吐量的影响:

  • topic可以达到几百,几千个的级别,吞吐量会有较小幅度的下降这是RocketMQ的一大优势,在同等机器下,可以支撑大量的topic

时效性:

  • ms级

优劣势总结:

  • 接口简单易用,而且毕竟在阿里大规模应用过,有阿里品牌保障日处理消息上百亿之多,可以做到大规模吞吐,性能也非常好,分布式扩展也很方便,社区维护还可以,可靠性和可用性都是ok的,还可以支撑大规模的topic数量,支持复杂MQ业务场景而且一个很大的优势在于,阿里出品都是java系的,我们可以自己阅读源码,定制自己公司的MQ,可以掌控社区活跃度相对较为一般,不过也还可以,文档相对来说简单一些,然后接口这块不是按照标准JMS规范走的有些系统要迁移需要修改大量代码还有就是阿里出台的技术,你得做好这个技术万一被抛弃,社区黄掉的风险,那如果你们公司有技术实力我觉得用RocketMQ挺好的