1、什么是消息中间件?
--基于队列模型实现异步传输数据,可以实现抗高并发/异步/解耦/流量消峰。
1.1 如何能抗高并发?
--基于队列,根据消费者能力进行消费,而不是一次性全部消费完,对瞬时流量进行缓冲,从而实现抵抗高并发。
1.2 什么是异步?
--将程序中耗时的代码解构出来,单独开个线程执行,不影响整个业务的响应时间。
1.3 什么是解耦?
--系统模块之间的依赖性较强时,将共同依赖的不同结构出来,通过接口的形式调用,降低模块之间的强依赖关系。
--比如A模块依赖B模块中的功能,一旦B模块挂了,A模块就会收到影响。所以将B中AB都需要的功能结构出来,这个过程叫做解耦。
1.4 什么是流量消峰?
--对服务器的瞬时流量值进行缓冲,存储到队列中,再根据消费者的能力进行消费。
2、Http请求有哪些缺点:后台业务逻辑耗时,响应超时;高并发崩溃
--用户体验不好,基于请求与相应,响应超时造成用户体验不好。
--高并发容易造成系统崩溃
--重试会造成幂等性问题
3、MQ与多线程的区别
--多线程只能实现异步,比较消耗CPU,且没有实现解耦。
4、MQ物件
--virtualHost-->Producer-->message-->Exchange-->Top-->Queue-->message-->Comsumer
5、生产者如果获取消费结果
--生产者投递成功将消息id返回给前端,消费者消费成功将消息id插入db,前端通过ajax定时通过消息id查询数据库。
6、什么是工作队列
--与工作队列对应的是均摊队列,就是每个消费者均摊消费;而工作队列根据消费者的能力进行消费,设置一次给消费者推送的消息数量。
7、MQ如何避免消息堆积/提高消息的消费速度?
8、MQ如何避免消息重复消费/如何解决幂等性问题?
9、MQ如何确保消息在生产者、MQ服务器、消费者阶段丢失?
10、如何确保消息消费顺序一致?
--绑定同一个队列和消费者。
11、MQ消息的推与拉形式
--MQ服务器与消费者建立长连接后,会主动推数据给消费者。
--消费者第一次启动的时候,会主动找服务器拉取数据,建立长连接。
12、MQ如何实现抗高并发?
--通过将消息缓存到队列,根据消费者的消费能力对队列中的消息进行消费,而不是一次性全部消费完所有消息。
13、死信队列
13.1 产生背景
消息超时、队列满载、消费多次失败。
13.2 架构原理
将对应消息转移到死信交换机,死信交换机将消息分发给死信队列,死信消费者进行消费。
13.3 应用场景
这种情况在支付中用的比较多,比如超时支付。
14、幂等性问题
14.1 产生幂等性背景
网络波动等导致暂时调用接口失败的情况需要重试。
14.2 自动重试机制
MQ消费者消费失败会自动重试,默认无限次数重试。可配置重试次数和间隔时间。
14.3 如何避免重复消费
重复消费会导致的后果是数据库中数据不一致的问题。对数据库的操作有增删改查,查无妨,删原理同改,所以只需处理增和改两种情况。
增:通过唯一性约束进行控制;改:通过乐观锁版本号控制