消息的其他问题

# 消息 ## 消息丢失问题 ### 为什么会出现消息丢失问题? 1. P->B(略) 2. E->Q(略) 3. Q->C(略) ### 怎么解决消息丢失问题? > **可以采用事务信道的方案, 但是这种方案的效率极低, 虽然能保证消息的不丢失, 但是弊大于利** > **首先从最简单的入手, 即将自动ACK换成手动ACK, 解决Q->C的消息丢失问题** > **另外, 我们可以采取日志存储和定期重发机制, 在发送消息的每一个流程都记录消息日志状态, 利用回调(确认, 退回)来更新状态, 定期对异常状态重新发送, 从而解决消息丢失问题** > **注意, 如果消息发送失败不要用while重新发送, 因为网络故障不会瞬间恢复, 这样CPU空转会浪费大量资源** ## 消息重复问题 ### 为什么会出现消息重复问题? 1. 定时任务, 重新扫描未能成功处理的消息 2. 消息处理完成, ack时宕机导致消息没有被正常的ack 3. 消息处理失败, unack重新入队 ### 怎么解决消息重复问题? **其实只需要处理成功了, 消息没有ack的这个问题, 其他两个本来就处理失败, 因该要重复处理**, ***我们保证操作的幂等性即可, 如我们的项目, 取消订单天生具有幂等性(改成指定状态, 之前说过), 而解锁库存也通过工作单状态保证了幂等性, 因此, 只需要保证幂等性, 重复问题就可以解决*** ## 消息积压问题 ### 为什么会出现消息积压问题? 1. 生产者发送消息的流量太大了, 即生产者生产消息的能力太强了 2. 消费者宕机了 3. 消费者处理消息的能力不足 ### 怎么解决消息积压问题? 1. 消费者采取集群的方式, 提高消费者处理消息的能力 2. 对生产者进行限流, 控制消息的生产速度 3. 消费者将消息扔到数据库中, 以后慢慢处理(离线处理)