【发布时间】:2017-10-26 07:14:35
【问题描述】:
如何在非事务性、轻量级的环境中保证消息传递?
例如:
- 正常情况:写入数据库,提交,向ZeroMQ|Redis|OtherMQ发送消息,消费者拉取消息继续处理...
- 0.05% 情况:写入数据库,提交,应用程序死掉!,没有消息发送,没有消费者拉消息,处理不完整。
这种情况下如何不丢失消息(避免不发送消息)?
编辑:消息必须只发送一次。
【问题讨论】:
-
在生产者发送消息时将数据库中的消息标记为“已发送”,在启动时获取所有“未发送”消息,不是吗?除非您可以将有关未发送消息的信息存储在某处,否则没有其他方法。
-
@cassandrad 应用程序可能会在消息发送到 MQserver 之后但在应用程序标记消息在数据库中发送之前终止。其他选项:在相同的 db 事务中,消息(在 db 表中)仍在等待消费者。提交,发送消息,消费者拉取消息,消费者必须做的第一件事就是将消息标记为在数据库中收到。但我认为这种方法对于高频消息来说很慢。
-
“在消息发送到 MQserver 之后,应用程序标记消息在 db 中发送之前,他的应用程序可能会死掉”。完全没问题,应用程序启动时会再次发送消息,不是吗?您没有指定交付选项应该是一次。
-
但是如果再次发送消息,相同的消息会被消费两次或更多。消息必须只发送一次。
-
那么你需要在你的问题中指定它,因为它很重要。
标签: transactions zeromq microservices mq 2phase-commit