服务启动失败
-
问题出现场景:
服务启动失败
之前启动成功过
-
问题排查:
-
检查端口冲突
- rabbitmq-server -detached
-
检查日志文件:erl_crash.dump的Slogan的值中找
- duplicate_node_name:节点名字重复
- rabbit_memory_monitor:磁盘空间不足
- start failed with file locked:文件被锁定
-
解决方案:
- 停止节点
- 停止所有节点:rabbitmqctl stop
- 停止指定节点:rabbitmqctl -n 节点名 stop
- 清理磁盘空间
- 检查文件权限
- 停止节点
重启服务
-
## 消费失败问题
- 出现场景:
- 微信token过期
- 网络波动
- 业务逻辑、代码问题
- RabbitMQ服务器出现故障或崩溃
- 消费超时
- 解决方案:
- 优化业务代码逻辑、sql
- 使用消息确认机制和事务机制
- 设置消息唯一标识
- 合理安排消费者
- 使用集群
消息丢失问题
根据数据模型可以分为生产者、消息队列、消费者三个维度进行分析
- 生产者
- 提交时丢失:事务机制:利用异常回滚的特点保证业务和消息的原子性从而保证一致性
- 发送时丢失:确认机制:将路由通道设置为confirm模式,通过唯一id和消息执行状态来判断生产者中消息是否路由成功
- 消息队列
- 持久化机制:配合confirm模式和事务机制进行将消息存储在磁盘上,保证当服务宕机时数据不丢失
- 消费者
- 手动ACK机制:存在重复消费、性能下降的隐患
- 错误日志机制:异常捕获记录日志
消费有序性问题
- 队列与消费者一对一:通过一定规则进行拆分队列,然后被拆分的队列可满足按顺序消费
- 加顺序字段:判读顺序字段从而判断消息顺序
消息堆积问题
- 出现场景:生产者的生产速度与消费者的消费速度不匹配
- 消费者消费能力弱
- 消息消费失败反复重试
- 消费端出了问题,导致不消费了或者消费极其慢
- 解决方案:
- 优化代码逻辑
- 合理设置消费端数量(多线程批量消费)
- 临时扩容处理堆积的消息
- 重导:当设置了过期时间后,虽然没有了大量消息积压,但是会丢失大量数据,所以将即将过期的消息先持久化,然后写一个脚本将重新发送到mq中
- 采用手动丢弃+重导机制