1.项目中在什么地方是用了MQ
1.使用mq异步发送优惠券
2.使用mq异步发送短信
3.使用mq异步扣减库存
4.使用mq异步审核贷款金额
实现异步的方式: MQ 和多线程
2.为什么需要使用MQ
1.异步处理(MQ和多线程)
2.实现解耦
3.流量削峰 (实现高并发)
3.MQ实现异步和多线程有什么区别?
1.多线程实现异步可能会消耗我们的CPU资源,可能会影响我们业务线程执行会发生CPU竞争问题
2.MQ实现异步完全是解耦的,适合大型互联网项目
3.小的项目使用多线程实现异步,大项目建议使用MQ
4.MQ如何避免消息堆积问题?
1.长生背景:
生产者投递消息的速率与消费者消费的速率不匹配
2.生产者投递消息的速率>消费者消费的速率
导致消息会堆积在MQ中,没有及时被消费者消费 ,所以产生了消息堆积的问题
3.注意:
rabbitmq 消费者消费消息成功后,消息会被立即删除
kafka和rocketMQ消息被消费后,不会被立即删除
4.解决办法:
1.提高消费者的消费速率(消费者实现集群)
2.消费者应该批量形式获取消息,减少网络传输的次数
5.MQ如何保证消息不丢失
1.MQ服务器端
将消息进行持久化到磁盘上
2.生产者
消息发布确认(单个确认,批量确认,异步确认)
可以将消息进行缓存到redis或者mysql中,根据日志进行补偿机制
3.消费者
必须确认消息消费成功(消息应答)
rabbitMQ 消息消费成功 会删除消息
rocketMQ消费成功,不会删除消息
6.MQ如何保证消息顺序一致性问题
核心办法:消息投递到同一个mq中,同一个分区模型,最终被同一个消费者消费
1. 大多数的项目是不需要保证 mq 消息顺序一致性的问题,只有在一些特定的场景可能会
需要,比如 MySQL 与 Redis 实现异步同步数据;
2. 所有消息需要投递到同一个 mq 服务器,同一个分区模型中存放,最终被同一个消费者
消费,核心原理: 设定相同的消息 key,根据相同的消息 key 计算 hash 存放在同一个分区
中。
3. 如果保证了消息顺序一致性有可能降低我们消费者消费的速率。
7.如何保证消息的幂等性问题?
1. 消费者获取消息,如果消费消息失败, mq 服务器则会间隔的形式 实现重试策略;
2. 重试过程中,需要保证业务幂等性问题,保证业务不能够重复执行
3. 我们可以通过全局的消息 id ,提前查询如果该业务逻辑已经执行过,则不会重复执行。
4. 我们也需要在数据库的 db 层面需要保证幂等性问题,唯一主键约束、乐观锁等。
8.mysql和Redis如何保证数据的一致性
产生背景:
在分布式领域中同步数据,很难保证强一致性,都是采用最终一致性思想 ,短暂的数据延迟是允许的,但是最终数据必须要保证一致性.
方案一:直接删除redis缓存(延迟双删)
方案二:基于mq异步同步更新
方案三 :基于cannal框架订阅binlog同步
9.Canal框架
1.canal服务器伪装成mysql从节点订阅我们的mysql主节点binlog文件
2.当 mysql主节点binlog文件发生变化,则会给canal服务器端
3.canal服务器端将binlog文件转化成 json的格式发送给kafka
4.消费者订阅kafka实现异步的形式将数据同步到redis中
注意:需要考虑kafka消息一致性问题