对消息队列的理解
把要传输的数据放到队列中
放数据的一方叫生产者,取数据的一方叫消费者
为什么要使用消息队列?消息队列的好处是什么?
1.解耦
2.异步
3.削峰/限流
JDK 提供的 Queue 和消息队列有什么区别?
使用消息队列应该是集群/分布式环境,Queue 是简单的内存队列
消费者如何得到生产者数据?
消费者主动轮训 pull 数据
异步处理时多线程和消息队列的比较
多线程会消耗CPU资源,占用主服务器资源,
消息队列可以放到其他机器上,需要解耦时使用消息队列
消息队列是在架构层面解决问题,多线程是在代码层面解决问题
消息队列的技术选型
Kafka 配合大数据、日志采集
ActiveMQ、RabbitMQ 单机吞吐量和 github 活跃度低、结构为主从架构
RocketMQ 阿里开源,分布式架构
如何保证消息不被重复消费?
保证接口幂等,根据消息的唯一标识去查一下是否消费过
如何保证消息是按照顺序的?
案例场景:
订单创建、支付、发货、收货
生产者顺序是增删改,消费者可能就变成删改增。
RocketMQ,提供了MessageQueueSelector队列选择机制,
有三种实现:1.
采用hash取模法,让同一个订单发送到同一个队列中,在使用同步发送,
只有同个订单的创建消息发送成功,在发送支付消息,
这样就保证消息顺序发送,RocketMQ 的topic内的队列机制,可以保证先进先出。
RMQ如何保证数据一致性?
引入分布式事务
分布式事务解决方案
1. 强一致性
2PC(两段式提交)
3PC(三段式提交)
最大努力通知
XA
2.最终一致性
最终一致性
HALF MESSAGE :
事务消息、半消息,标识该消息处于暂时不能投递状态,不会被消费者消费,待MQ收到生产者对该消息的commit或者rollback后,消息会被正式投递或者回滚
RMQ_SYS_TRANS_HALF_TOPIC:
半消息存储的队列
RMQ_SYS_TRANS_OP_HALF_TOPIC:
半消息commit或者rollback后存储的队列
RockMQ分布式事务核心思想是:分段提交,定时回查
流程:
1:生产者向MQ提交半消息
2:MQ通知生产者半消息发送成功
3:生产者执行本地事务
4:根据本地事务结果,通知MQ对半消息做commit还是rollback
5:如果MQ没收到生产者确认结果,将轮训根据唯一ID发起生产者本地事务回查
6:生产者回查本地事务运行结果
7:生产者发送本地事务回查结果到MQ
8:MQ收到生产者半消息处理结果,如果是commit,将半消息
提交到真正的业务队列中
9:消费者消费MQ的消息,失败重试
RMQ版本
RMQ3.0.6以后去掉了事务回查接口