什么是真实情况的示例,其中消息排队系统可以接受某些消息的丢失



我正在阅读此博客文章,其中作者在消息队列的背景下提出了以下问题:

是否丢失了一条消息?如果您应用节点,处理请求,死亡,您可以恢复吗?您会感到惊讶的是它实际上并不重要,并且可以正常运行,而无需保证所有消息都已处理

起初,我认为处理消息的要点是从不松开一条消息 - 毕竟,丢失的消息可能意味着未预订的酒店预订,尚未完成结帐或任何其他功能没有通过,这似乎与我的错误太相似。我想我缺少一些东西,所以,消息传递系统可以松散一些消息的情况是什么?

,好吧,您最初的期望:

处理消息的要点
从不

不是一个正确的一个。


对,如果一个人努力争取某种类型的鲁棒性,那么在这种情况下必须采取所有适当的护理和预防措施,因此,由于不会单一的消息丢失,是的,您的先验性表示的期望很适合。

这并不意味着所有其他系统设计都必须承担所有巨大的负担,并且必须支付所有发生的费用(资源方面的潜伏等),因为" 100 %的保证交付"系统确实如此(但是,只有在他们可以的情况下)。


反图案案件:

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

只是想象一个弱同步系统(包括一个系统,它完全没有反馈甚至任何最简单的反馈传播形式),传感器读取实际温度,声音,视频框架,并带有带有该值。

每当提供此类信息时,可能有一个理由不读取任何"旧"值,而是最新的一个。

如果一个交付框架已经有任何较新的值集,那么所有"旧"值尚未处理,只是从队列头处悬挂着一定的深度,但是在队列中,可能会创建反pattern,其中一个人不想阅读和处理所有这些"较旧"的值,而只是最新的值。

就像没有人会根据昨天的价格与您进行交易一样,基于阅读所有"旧"温度读数的任何新的,最新的决定,仍然在队列中等待。<<<<<<<<<<<<

某些智能消息框架提供了明确的手段,可以从给定来源获取非常"最新的"消息 - 从而使任何"旧的"消息迫使他们避免由于已知存在而被读取和处理一个"最新"。

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


效率首先:

在任何情况下,都会发生智能交付(要么提供原始消息内容的精确副本,要么是在所有情况下指出),但资源是尽最大努力的,但是,不花一分钱除了"即将到来"的智能交通。

建立鲁棒性的成本不仅仅是。
建立最终的鲁棒性,成本甚至更高。

系统的极端要求可以并且可能会扩大资源效率高的智能交付,以便以某种附加成本达到某些确定的鲁棒性水平。

相同但不可能逆转 - 如果"防止"系统是要获得纤细的形式和时尚,以适合任何受限的资源硬件或使其"忘记"某些"旧"此刻,消息没有正值(但相反,处理元素必须读取和处理每个"不必要的"消息,只是由于它已交付的事实,同时知道核心-Logic只需要最近的一个)。

分布式系统从许多分布式来源产生E2E-LATENCY,因此任何刚性交付的系统都 block> block并惩罚唯一的元素,谁是(延迟) innocent> - 接收器。

我想可以从某些测量单元中散发几条消息,这些单元可输送该值一次。数据分析解决方案很少有丢失的消息不会产生很大的差异

这一切都取决于应用程序/较大的系统。可以这么说,消息队列仅是链中的一个链接。如果末端的应用程序准备应对损失,那么丢失一些消息不是问题。如果应用程序依靠总消息传递完整性,则会出现问题。

一个系统的示例将是损失,这是手机的天气更新。如果一些温度/风更新不会给您带来任何真正的伤害。

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

我在安全,基础架构级系统上工作很多,并负责大部分时间发送消息。许多系统清楚地指出,消息传递可能会重新排序,重复或丢失消息。这只是涉及分布式系统和网络的生活事实。需要设计端点系统在该环境中正确工作。因此,他们跟踪消息,端到端的ACK,处理重复和重新传播等等。

最新更新