RocketMQ
为什么要使用MQ
核心:解耦,异步,削峰
- 解耦:如果不用MQ,那么在A系统向其他系统发送数据时,就会导致A系统与其他系统产生严重耦合,A系统需要向多个系统发送数据,而且多个系统(包含新的系统)也需要A的数据;而使用MQ之后,A系统不需要知道其他系统的存在,只需要向MQ提供数据,其他系统(包含新的系统)也不需要知道发送者的存在,只需要订阅MQ或者进MQ里消费数据即可。就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,所以可以用 MQ 给它异步化解耦。
- 异步:如果不用MQ,假设 A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,那么 A 系统的响应时间就是四个系统的整个处理时间的总和。而使用 MQ 之后,A 系统只需要把请求发送到 MQ,处理完自己的业务逻辑后就可以返回给用户响应,响应时间大大缩短。其他系统则可以在 MQ 里面消费后再处理自己的业务逻辑。
- 削峰:对高峰期流量进行缓冲
MQ有什么优缺点
优点就是上面的核心
缺点:
- 系统可用性降低:系统引入的依赖越多,越容易出现系统崩溃,一旦MQ出现问题,整个系统都会瘫痪。
- 系统复杂度提升:引入MQ之后,系统的复杂度也会提升,还需要考虑消息的重复消费,消息的丢失,消息的传递的顺序等问题
- 一致性问题:MQ的消息传递是异步的, 无法保证MQ后面的系统消费的消息与处理的结果一致,也就是与生产者发送消息不能完全保持一致性。
Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别
- 对于吞吐量来说kafka和RocketMQ支撑高吞吐,ActiveMQ和RabbitMQ比他们低一个数量级。
- 对于延迟量来说RabbitMQ是最低的。
- 对于持久化消息,ActiveMQ和RabbitMQ支持持久化,持久化消息是指机器在不可抗力下掉电后,消息不丢失
- 对于高并发,RabbitMQ和RocketMQ都支持,RabbitMQ的并发量更高,原因是它的实现语言是天生具备高并发高可用的 erlang 语言。
一、消息队列模型(保证消息的顺序性)
消息有序指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ可以严格的保证消息有序,可以分为分区有序或者全局有序。
消息错乱的原因:在默认的情况下消息发送会采取Round Robin轮询方式把消息发送到不同的queue(分区队列);而消费消息的时候从多个queue上拉取消息,这种情况发送和消费是不能保证顺序。
保证顺序性:控制发送的顺序消息只依次(FIFO)发送到同一个queue中,消费的时候只从这个queue上依次拉取,则就保证了顺序
- 全局有序:发送和消费参与的queue只有一个
- 分区有序:多个queue参与,相对每个queue,消息都是有序的