先来说说什么是MQ,MQ与多线程之间的区别
MQ是消息中间件 可以实现异步 多线程也可以实现异步
使用传统http协议方式调用接口存在的缺点
如果服务器端没有及时的响应给客户端的时候,容易造成客户端阻塞等待。
服务器响应超时 客户端发送重试机制 需要考虑避免业务逻辑重复执行
无法支持高并发请求
如果服务器端不在的情况下,容易丢失请求,比如发送个请求消息,服务器突然宕机了。
如果服务器端处理每个请求非常耗时时间的情况下,容易导致客户端的请求阻塞等待。
多线程处理异步的缺点
在同一个时刻只有一个cpu只能够运行一个线程
非常消耗cpu的资源,有可能影响到业务线程正常接收客户端的请求。
所以小的项目可以使用多线程实现异步 大项目建议一定使用mq
MQ为何能够实现抗高并发,异步解耦
mq分成几个角色 mq服务器端 生产者 消费者
生产者投递消息 ma服务器端存放消息
如何提高消费者速率
消费者实现批量获取消息
消费者实现集群
主动推送:
主动推送(mq服务器主动推送消费者)消费者与mq服务器端已经建立连接之后,生产者投递消息给mq服务器端,mq服务器端主动将消息推送给消费者。
消息拉取(消费者)
生产者投递消息给mq服务器端,但是消费者不在,消费者在启动的时候与mq服务器端建立连接,判断消费者订阅队列有哪些消息还没有被消费。
mq如何保证消息不丢失
mq服务器端:消息持久化到硬盘
生产者:确保我们的消息投递到mq服务器中
消费者 必须确认消息消费成功
mq如何保证消息顺序一致性
所有消息需要投递到同一个mq服务器,同一个分区模型中存放,最终被同一个消费者消费,核心原理
设定相同的消息key,根据相同的消息key计算hash存放在同一个分区中
如果保证了消息顺序一致性就有可能降低我们消费者消费的速率。
核心办法;消息一定要投递到同一个mq,同一个分区模型,最终被同一个消费者消费。
mq如何保证幂等性的问题
何为幂等性问题,mq服务器向消费者投递了两次相同的消息。就会导致数据库出现了两条相同的数据。
怎么解决了,从全局id的角度去出发,比如msg会自带全局id,跟据全局id去查询,也可以根据业务id去定,先去根据id在数据库中查下,然后有就不插入。
mq与redis如何保证数据一致性问题
在分布式领域中同步数据,很难保证强一致性策略,都是采用最终一致性思想,
短暂的数据延迟是允许的,但是最终数据必须要保证一致性。
方案一 直接删除Redis缓存 延迟双删策略 适用于小项目
方案二 基于MQ异步同步更新
方案三 基于canal框架订阅binlog同步