0
点赞
收藏
分享

微信扫一扫

MQ相关知识点

柠檬的那个酸_2333 2022-04-21 阅读 68
java

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消息一致性问题

举报

相关推荐

0 条评论