MQ的常用场景及常见的MQ简介

MQ(Message Queue)是一个常用的消息中间件,在各种场景都能见到MQ的身影,其最主要的三个场景分别是异步、解耦、削峰。

异步:当一个交易的链路涉及多个系统的互相调用时,系统处理完毕,返回结果的时长会比较长,用户需要等待这一段时间才能看到结果,往往体验就比较差。这时我们就可以在系统中加入MQ,系统接受用户请求之后,直接将请求发送给MQ,然后返回结果给用户,响应很快,之后的其他的系统再从MQ中消费消息,完成整个流程。
MQ的常用场景及常见的MQ简介

解耦:如果多个系统需要从一个系统里面取需要的数据,最简单的写法就是将系统之间强耦合,各个系统调用提供数据系统的方法获取数据,但是这样拓展性很差,当获取数据的系统增加或者减少,不能动态完成,只能修改代码,并且提供数据系统还需要考虑到调用失败等问题。如果使用MQ的话,利用MQ的Pub/Sub(发布订阅)模型,数据提供者将数据放入MQ中,其他的系统从MQ中消费数据即可,起到了解耦的作用。
MQ的常用场景及常见的MQ简介

削峰:在很多的秒杀活动中,会存在瞬时流量暴增的场景,平时可能整个系统的QPS就只有几百,但是在活动的时候,QPS一下子增加到了几万,如果不限流的话,这么多的流量直接进入Mysql,就可能直接让Mysql宕机。这时如果加入了MQ,先将这些数据直接放入MQ中,Mysql依旧以一个可承载的速度消费MQ的数据,高峰期的时候,MQ中积压了非常多的数据,在流量正常的时候,Mysql就可以将积压的数据消费完,MQ就降低了高峰期的流量压力。
MQ的常用场景及常见的MQ简介
常见MQ技术选型

  1. ActiveMQ

老牌MQ,单机吞吐量万级,社区不活跃,不推荐使用

  1. RabbitMQ

单机吞吐量万级,使用erlang语音编写,时效性是微秒级,延迟低,可以基于主从架构实现高可用,基本不会丢失数据,而且可视化界面功能非常强大,使用很方便,如果要自定义一些功能的话,可能基于erlang开发较难,对于一些吞吐量要求不是特别高,或是延迟要求低的场景推荐使用

  1. RocketMQ

阿里开源的一款消息中间件,吞吐量达到十万级别,可以支持大量的topic,且并不会对吞吐量有较大影响,分布式架构,通过参数的配置可以实现消息零丢失,自带分布式事务配置,java语言编写,更方便通过修改源码自定义一些功能。缺点是文档较为简单,很多东西需要自己摸索。

  1. Kafka

大数据场景下的业内规范,一般用来做数据计算、日志采集等。吞吐量达到十万级别,分布式架构,可用性非常高,支持集群部署,即使部分机器宕机也不会影响功能,通过参数的配置可以实现消息零丢失。Kafka的功能较为单一,不像RabbitMQ和RocketMQ一样,支持消息回溯、死信队列等高级功能,但是Kafka的应用场景也不需要这些功能,所以并不影响Kafka在大数据领域的地位。