ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MQ

2021-09-30 16:32:16  阅读:131  来源: 互联网

标签:事务 队列 发送 ack MQ 消息


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的普通集群模式
解决不了高可用的

只是考虑到性能

标签:事务,队列,发送,ack,MQ,消息
来源: https://www.cnblogs.com/chengshentao/p/15357346.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有