如何保证消息不丢失?
产生丢失消息的节点主要有以下几点
- 生产者发到broker
- broker把消息从缓存写入磁盘
- breker同步到从节点
- 消费者消费消息
- 消息积压太多, 会删除历史消息, 这里不会校验消息有没有消费
解决:
- 生产者同步发送消息, 如果发送失败, 写重试逻辑, 如果重试多次还失败, 可以存到数据库, 定时任务重试
- 生产者发送事务消息, 保证本地事务和发送消息一致性, 间接达到消息不丢失
- broker先写入缓存, 如果缓存来不及写入磁盘, 可能造成消息丢失. 可以配置同步刷盘解决这个问题, 收到客户端一条消息马上写磁盘, 可能造成性能问题, rmq默认是10ms写一次
- Dledger主从架构保证MQ主从同步时不会丢消息.
- 采用两阶段方式, 主broker的DledgerServer收到消息后, 会先标记为uncommitted状态, 然后把
- 然后主broker的DledgerServer把消息发送到从broker的DledgerServer组件
- 从broker的DledgerServer收到消息后会返回一个ack
- 主broker的DledgerServer收到半数以上的ack, 才会把uncommitted改成commited
- 消费者不要使用异步或者try catch, 固定返回SUCCESS.应该根据实际业务, 真的处理成功再返回成功, 如果消费失败, 消费者会自动重试
如何快速处理消息大量积压
- 如果消息不重要, 允许丢失, 可以在控制台直接跳过消息
- 增加消费节点. 注意: 一个messageQueue只能被一个消费者消费, 因此消费者不能超过messqgeQueue数量
- 转移Topic. 将消息转发到新的TOPIC, 新的TOPIC又会分配新的MessageQueue, 并行消费.
- 将消息存到数据库, 削峰, 开定时任务慢慢消费
Rmq如何实现高性能
- 消息零拷贝
- 所有消息都写到commitlog, 顺序写
- 文件索引机制
- 推模式实时推送消息