一、什么是MQ?MQ的原理是什么?
MQ就是消息队列,是Message Queue的缩写。消息队列是一种通信方式。消息的本质就是一种数据结构。因为MQ把项目中的消息集中式的处理和存储,所以MQ主要有解耦,并发,和削峰的功能。
1,解耦:
MQ的消息生产者和消费者互相不关心对方是否存在,通过MQ这个中间件的存在,使整个系统达到解耦的作用。
如果服务之间用RPC通信,当一个服务跟几百个服务通信时,如果那个服务的通信接口改变,那么几百个服务的通信接口都的跟着变动,这是非常头疼的一件事。
但是采用MQ之后,不管是生产者或者消费者都可以单独改变自己。他们的改变不会影响到别的服务。从而达到解耦的目的。为什么要解耦呢?说白了就是方便,减少不必要的工作量。
2,并发
MQ有生产者集群和消费者集群,所以客户端是亿级用户时,他们都是并行的。从而大大提升响应速度。
3,削峰
因为MQ能存储的消息量很大,所以他可以把大量的消息请求先存下了,然后再并发的方式慢慢处理。
如果采用RPC通信,每一次请求用调用RPC接口,当请求量巨大的时候,因为RPC的请求是很耗资源的,所以巨大的请求一定会压垮服务器。
削峰的目的是用户体验变好,并且使整个系统稳定。能承受大量请求消息。
二、现在市面上有什么MQ,
重点介绍RocketMQ
现在市面上的MQ有很多,主要有RabbitMQ,ActiveMQ,ZeroMQ,RocketMQ,Kafka等等,这些都是开源的MQ产品。以前很多人推荐使用RabbitMQ,他也是非常好用的MQ产品,这里不做过多的介绍。Kafka也是高吞吐量的老大,我们这里也不介绍。
我们重点介绍一下RocketMQ,RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache软件基金会,并于并于2017年9月25日成为 Apache 的顶级项目。
作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。
功能概览图
可以看见RocketMQ支持定时和延时消息,这是RabbitMQ所没有的能力。
RocketMQ的物理结构
从这里可以看出,RocketMQ涉及到四大集群,producer,Name Server,Consumer,Broker。
Producer集群:
是生产者集群,负责产生消息,向消费者发送由业务应用程序系统生成的消息,RocketMQ提供三种方式发送消息:同步,异步,单向。
一,普通消息
1,同步原理图
同步消息关键代码
2,异步原理图
异步消息关键代码
3,单向(Oneway)发送原理图
单向只发送,不等待返回,所以速度最快,一般在微秒级,但可能丢失
单向(Oneway)发送消息关键代码
三种发送消息具体代码请参考文档:https://help.aliyun.com/document_detail/29547.html?spm=a2c4g.11186623.6.566.7e49793fuueSlB[1]
二,定时消息和延时消息
发送定时消息关键代码
发送延时消息关键代码
注意事项
1,定时和延时消息的 msg.setStartDeliverTime 参数需要设置成当前时间戳之后的某个时刻(单位毫秒)。如果被设置成当前时间戳之前的某个时刻,消息将立刻投递给消费者。
2,定时和延时消息的 msg.setStartDeliverTime 参数可设置40天内的任何时刻(单位毫秒),超过40天消息发送将失败。
3,StartDeliverTime 是服务端开始向消费端投递的时间。 如果消费者当前有消息堆积,那么定时和延时消息会排在堆积消息后面,将不能严格按照配置的时间进行投递。
4,由于客户端和服务端可能存在时间差,消息的实际投递时间与客户端设置的投递时间之间可能存在偏差。
5,设置定时和延时消息的投递时间后,依然受 3 天的消息保存时长限制。例如,设置定时消息 5 天后才能被消费,如果第 5 天后一直没被消费,那么这条消息将在第8天被删除。
6,除 Java 语言支持延时消息外,其他语言都不支持延时消息。
发布消息原理图