MQ 一开始是用来解决通信问题的
MQ的异步通信 可以削峰 抵御大量流量
异步、解耦、削峰
一、RabbitMQ事务消息
1.可以通知服务器开启事务模式
2.发送消息 其实消息是先存储在一个临时队列
3.提交事务 消息真正的提交到指定队列
4.回滚事务
消费者使用事务 autoAck=false 手动提交ack,以事务提交或回滚为准
autoAck=true 是不支持事务的
如果任意环节出现了问题,就会抛出IOExeception 可以进行拦截,决定要不要进行回滚
事务消息会造成阻塞
二、RabbitMQ如何保证消息的可靠性传输
1. 事务消息就可以保证可靠性 但是性能比较查
2.使用消息确认机制 ack
发送方确认:
1.channel设置成confirm模式,则每条消息会被分配一个唯一id
2.消息投递成功后,信道会发送一个ack给生产者,包含了id,回调ConfirmCallBack接口
3.如果消息发生错误丢失,发送nack给生产者,回调ReturnCallBack接口
4.ack和nack只有一个触发,且只有一次,异步触发,可以继续发送消息
接收方确认:
1.生命队列时,指定noack=false,broker会等待消费者手动返回ack,才会删除消息,否则立即删除
2.broker的ack没有超时机制,只会判断链接是否断开,如果断开,消息会被重发
三、如何保证消费的幂等性
所有MQ产品并没有提供主动解决幂等性的机制,需要由消费者自行控制
RocketMQ:给每个消息分配了MessageID,这个MessageID就可以作为消费者判断幂等的依据
最好的方式就是自己带一个有业务标识的ID,来进行幂等性判断 OrderID
或者就是主动的给自己的消息分配一个ID
四、RabbitMQ怎么保证消息不丢失
1.生产者
同步阻塞的方式发送消息,加上失败重试机制,可能broker存储失败,可以通过查询确认
异步发送需要重写回调方法,检查发送结果
broker:同步刷盘,集群模式下采用同步复制,会等待slave复制完在确认返回
消费者:offset手动提交,消息保证消费幂等
五、MQ如何保证消息顺序
1.RocketMQ中有完整的设计 生产者通过MessageSelector(监听)将一组有序的消息放到同一队列中,而消费者一次消费整个队列当中的消息
2.RabbitMQ 要保证目标exchange只对应一个队列 并且一个队列只对应一个消费者
比较影响性能
3.kafka:生产者通过定制partition分配规则,将消息分配到同一个partition。Topic下只对应一个消费者
六、如何保证消息可靠传输
这个就要拆分成几个问题,消息既不能多也不能少
需要避免重复消费 消息不能少 需要确认机制 和消息队列持久化
还有就是消息的丢失问题
七、rabbitMQ的普通集群模式
解决不了高可用的
只是考虑到性能