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