项目中有使用mq的地方
1,使用mq 异步发送优惠券
2,使用mq异步发送短信
3,使用mq异步扣库存
总之比较耗时的代码操作,交给mq异步实现接口。
为什么使用mq
1 ,异步处理(多线程和MQ);
- 实现解耦
3,流量消峰(mq可以实现抗高并发)
MQ 与多线程实现异步的区别
1, 多线程方式实现异步可能会消耗我们的cpu资源,可能会影响到我们的业务线程执行,会发生cpu竞争的问题。
2,MQ 方式实现异步是完全解耦。适合于大型互联网项目;
3, 小的项目可以使用多线程实现异步,大项目建议使用mq实现异步。
MQ如何避免消息堆积的问题
1,产生背景
生产者投递消息的速率与我们消费者的速率完全不匹配
2,生产者投递消息的速率 > 消费者的速率
导致我们消息会堆积在我们mq服务器端中,没有及时的被消费者消费,所以就产生消息堆积的问题。
3,注意的是: rabbitmq消费者我们的消息如果成功的话 消息会被删除,kafka 或者rocketmq 消息消费如果成功的话,消息是不会被立即删除的。
4,解决方法
a 提高消费者消费的速率:(对我们的消费者实现集群)
b 消费者应该批量形式获取消息 减少网络传输的次数
MQ宕机了消息是否会丢失呢
不会 因为消息会持久化在我们的硬盘中;
mq如何保证消息不丢失
1 MQ服务器
消息持久化到硬盘中
2 生产者
消息确认机制
必须确认消息刷盘到硬盘中,才能够人为消息投递成功
3,消费者
必须确认消息消费成功
rabbitmq中: 才会将消息删除
rocketmq 或者 kafka 中,才会提交offset。
生产者投递消息,mq宕机了如何处理
1, 生产者投递消息会将ms消息内容记录下来,后期如果发生生产者投递消息失败;
- 可以根据该日志记录实现补偿机制
- 补偿机制(获取到该msg日志消息内容实现重试)
MQ如何保证消息顺序一致性问题
1 大多数的项目是不需要保证mq消息顺序一致性的问题,只有在一些特定的场景可能会需要,比如 MySQL与Redis 实现异步同步数据;
2, 所有消息需要投递到同一个mq服务器,同一个分区模型中存放,最终被同一个消费者消费,核心原理: 设定相同的消息key,根据相同的消息key 计算hash 存放到同一个分区中。
3, 如果保证了消息顺序一致性有可能降低我们消费者消费的速率。
MQ 如何保证消息幂等问题;
1 消费者获取消息,如果消费消息失败,mq服务器则会间隔的形式,实现重试策略
2 重试过程中,需要保证业务幂等性问题,保证业务不能够重复执行
3, 我们可以通过全局的消息id,提前查询到如果该业务逻辑已经执行过则不会在执行
4 我们也需要在数据库的db 层面需要保证幂等性问题 唯一主键约束 乐观锁等。
MQ 与Redis 如何保证数据一致性的问题
方案一 直接删除redis缓存
2 基于mq异步同步更新
3 基于canal 订阅binlog 同步。
网友评论