消息队列系统可以接受某些消息丢失的真实场景示例有哪些?

What are examples of real-world scenarios where a message queuing system can accept the loss of some messages?

我正在阅读 this blog post,其中作者在消息队列的上下文中提出了以下问题:

does it matter if a message is lost? If you application node, processing the request, dies, can you recover? You’ll be surprised how often it doesn’t actually matter, and you can function properly without guaranteeing all messages are processed

一开始我以为处理消息的要点是绝不丢失一条消息——毕竟,一条消息丢失可能意味着酒店预订未订,结账未完成,或任何其他未执行的功能,这对我来说似乎太像错误了。我想我遗漏了一些东西,那么,消息传递系统可以丢失一些消息的场景示例有哪些?

我想从一些测量单元中丢失一些消息是可以的,这些消息一次交付价值....同样对于大数据分析解决方案,丢失一些消息不会产生很大的影响

这一切都取决于application/larger系统。消息队列在链中只有一个link,可以这么说。如果末端的应用程序准备好处理丢失,丢失一些消息不是问题。如果应用程序依赖于消息传递的整体完整性,那么就会出现问题。

一个可以承受损失的系统示例是 phone 的天气更新。如果一些 temperature/wind 更新没有给你带来,那也没有真正的伤害。

现在,如果您是 运行 一个核反应堆,并且您丢失了一些核心温度更新,那么这就是一个问题。

我在安全关键的基础设施级系统上工作很多,并且大部分时间负责消息传递。其中许多系统都明确指出消息可能会重新排序、重复或丢失消息;这只是涉及分布式系统和网络的生活事实。端点系统需要设计为在该环境中正常工作。因此他们跟踪消息、端到端确认、处理重复和重新传输等。

嗯,你最初的期望:

the main point of handling messages
was to never loose a single message

只是不正确。


是的,如果一个人力求某种类型的健壮性,其中故障安全措施必须采取所有应有的谨慎和预防措施,以免丢失一条消息,是的,您先验地表达了期望适合。

这并不意味着所有其他系统设计都必须承担所有巨大的负担并支付所有产生的成本(资源方面、延迟方面等),因为“100+% 保证交付”系统可以(但是,再次强调,只有在它们可以的情况下)。


反模式案例:

有许多用例,其中最初发送的每条消息的绝对确定性实际上是一种反模式。

试想一个弱同步系统(包括那些没有反向节流甚至根本没有任何最简单形式的反馈传播的系统),其中传感器读取实际温度、声音、视频帧并发送具有该值的消息。

每当后处理系统传递此类信息时,可能有理由不读取任何和所有 "old" 值,而是读取最近的值。

如果交付框架已经获得任何更新的值集,所有 "older" 值,尚未处理,只是挂在队列头的某个深度,但在队列中,可能会创建反-pattern,其中一个人不想读取和处理任何和所有这些 "older" 值,而只是最近的一个值。

就像没有人会根据昨天的价格与您进行交易一样,没有任何积极的价值可以根据阅读任何和所有 "old" 温度读数做出任何新的、当前的决定,这仍在等待排队。

一些智能消息传递框架提供了从给定来源获取非常 "newest" 消息的明确方法 - 从而能够强制丢弃任何 "older" 消息,避免它们被正确读取和处理由于已知存在一个 "most" 最近的。

这回答了关于处理消息的假设要点的原始问题。


效率第一:

在任何情况下,如果发生智能传递(传递原始消息内容的精确副本或完全不注意),将尽最大努力使用资源,而无需花费任何费用除了 "just-enough" smart-delivery.

构建稳健性的成本远不止于此。
建立最终的稳健性,成本甚至远不止于此。

具有这种极端要求的系统可以并且可能会扩展资源高效的智能交付,以达到某些要求定义的稳健性级别,但需要一些附加成本。

相同但反过来是不可能的 -- 如果 "everything-proof" 系统要获得更纤薄的形式和时尚,以适应任何资源受限的硬件或使其成为 "forget"一些 "old" 消息,此时没有正值(但相反,构成处理元素读取和处理每条 "unwanted" 消息的必要条件,只是由于事实它已交付,同时知道核心逻辑只需要最新的一个)。

分布式系统会从许多分布式源中累积端到端延迟,因此任何严格的交付系统只会阻止并惩罚唯一的一个元素,即(延迟方面)innocent -- 接受者.