消息的其他问题
# 消息
## 消息丢失问题
### 为什么会出现消息丢失问题?
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. 消费者将消息扔到数据库中, 以后慢慢处理(离线处理)