RocketMq常见问题

如何保证消息不丢失?

产生丢失消息的节点主要有以下几点

  1. 生产者发到broker
  2. broker把消息从缓存写入磁盘
  3. breker同步到从节点
  4. 消费者消费消息
  5. 消息积压太多, 会删除历史消息, 这里不会校验消息有没有消费

RocketMq常见问题_第1张图片

解决:

  1. 生产者同步发送消息, 如果发送失败, 写重试逻辑, 如果重试多次还失败, 可以存到数据库, 定时任务重试
  2. 生产者发送事务消息, 保证本地事务和发送消息一致性, 间接达到消息不丢失
  3. broker先写入缓存, 如果缓存来不及写入磁盘, 可能造成消息丢失. 可以配置同步刷盘解决这个问题, 收到客户端一条消息马上写磁盘, 可能造成性能问题, rmq默认是10ms写一次
  4. Dledger主从架构保证MQ主从同步时不会丢消息.
    1. 采用两阶段方式, 主broker的DledgerServer收到消息后, 会先标记为uncommitted状态, 然后把
    2. 然后主broker的DledgerServer把消息发送到从broker的DledgerServer组件
    3. 从broker的DledgerServer收到消息后会返回一个ack
    4. 主broker的DledgerServer收到半数以上的ack, 才会把uncommitted改成commited
  5. 消费者不要使用异步或者try catch, 固定返回SUCCESS.应该根据实际业务, 真的处理成功再返回成功, 如果消费失败, 消费者会自动重试

如何快速处理消息大量积压

  1. 如果消息不重要, 允许丢失, 可以在控制台直接跳过消息
  2. 增加消费节点. 注意: 一个messageQueue只能被一个消费者消费, 因此消费者不能超过messqgeQueue数量
  3. 转移Topic. 将消息转发到新的TOPIC, 新的TOPIC又会分配新的MessageQueue, 并行消费.
  4. 将消息存到数据库, 削峰, 开定时任务慢慢消费 

RocketMq常见问题_第2张图片

Rmq如何实现高性能

  1. 消息零拷贝
  2. 所有消息都写到commitlog, 顺序写
  3. 文件索引机制
  4. 推模式实时推送消息

你可能感兴趣的:(rocketmq)