如何保证消息不丢失(可靠性)

4 分钟阅读 503 字 + 483 词
消息的可靠性 由三个部分保证
  1. == 生产者保证可靠性: ==
    1. 首先生产者在网络连接这块就有个 连接重试机制 ,当连接超时的时候,会根据间隔进行重试。但是这个重试是阻塞的重试,会对性能会有影响,一般不建议打开。
    2. 为了保证消息不丢失,RabbitMQ提供了 消息确认 机制。一个是Publisher Return ,一个是Publisher confirm
      1. publisher return 是表示 路由失败 的时候,返回 ack和异常消息
      2. publisher confirm 通过ack和nack来表示投递成功 的信息
        1. 临时消息 投递到了MQ,并且入队成功,会返回ACK。
        2. 持久消息 投递到了MQ,并且入队成功 并完成持久化 ,会返回ACK。
        3. 其他情况会返回 NACK,告知投递失败。
  2. == MQ保证可靠性: ==
    1. 设置 消息的持久化 属性,使消息 能够保存在磁盘上。在服务器宕机恢复之后重新恢复消息。并且使用事务来确保消息的持久化和发布的原子性。只有 消息被完全写入到磁盘上才确认发布成功
    2. 可以设置 队列为持久化 没有被消费的消息也会被持久化到磁盘中
  3. == 消费者保证可靠性 ==:
    1. 消费者可以通过 确认 机制, ack表示处理成功,nack表示处理失败,reject表示处理失败并拒绝消息
    2. ACK处理模式 可以设置三种模式:
      1. none表示不处理 。消息投递给消费者后立刻ack,消息会立刻从MQ中删除。非常不安全
      2. manual手动模式 。主动在代码中调用api发送ack或者reject,存在业务入侵,但是更加安全。
      3. **auto自动模式。**业务正常执行时自动返回ack,业务异常的话根据异常判断返回不同结果。
    3. 还存在 失败本地重试机制 ,处理失败不需要将消息再次入队再次发送,而是直接在本地重试。重试达到最大次数后,此时会返回reject。

目录