背压(2019)

2021-04-15 22:39:14

最后几个帖子的运行主题是分布式系统的基础知识。对于今天的帖子,让我们从短篇小说开始。

这个系统沿着很好哼了起来。偶尔的失败 - 即使是相当大的网络分裂 - 处理,并且服务合理恢复。update系统的各个部分都不会挂钩。

从不害怕,对吗?电力是回来的,所有的机器都恢复了,一切都应该恢复。偶尔的机器在这里和那里有新的物理失败应该不会构成问题。系统已经处理了这些问题。

经过一系列调查,发现数据库处于极端负载。每次查询到达,等待处理,并将其out.Allose Opt。

在检查缓存后,工程师开始获得沉没的感觉。高速缓存是空的.NO查询可以成功得足够远,即高速缓存甚至被单个条目填充。高速缓存没有加载数据库,而且数据库如此超载,没有任何实际的进展任何地方。系统可以无限期地留下来。

责任这一责任没有开始玩Homestar Runner音乐的同事。“该系统已关闭! Do-do-doo-doo!“它没有帮助。

使用过载系统的负载有两个非常基本的策略。

所有策略都是您真正需要一个封闭的系统。所有重试机制呈指数级返回(在5S中重试。重试10S。在20S中重试。)在20年代重试。

如果系统的某些部分被过载,则请求将失败,误差或超时。如果我们在本帖子开头的方案中,则每秒N请求导致系统无法进行任何进展,我们' ll很快得到每秒n / 2请求。然后,然后,n / 4和n / 8,依此类推,负载将掉到查询成功的点,缓存填充,更多的整体负载是取下数据库,系统恢复。

但是当您拥有一个开放系统时,这不是一张完整的图片 - 其中您的负载源于大量不受控制的外部派对。结算用户减慢他们的请求在您刚刚处理时没有多少帮助很多用户。

我们这里有的根本问题是客户没有足够的信息。他们只是太多了。(或......也许我们不相信恶意的小混蛋。)因此我们需要一个更集中的系统代表他们“知道事情”。

一个断路器正是知识和策略的一点。如果API的总体错误率变高,则旨在切断负载。断路器跳闸,并立即失败,传入的客户端请求失败试图将它们传送到系统的其余部分。

断路器在这里进行的关键问题是将多个请求一起关联。如果剩下的千言客户端都超时,则此客户端无法期望不同。此客户端只是不知道,因此急切地开始请求完全好像系统运行。所以断路器保护分布式系统的一部分从遥控源的负载源。

然而,这两种策略都依赖于同一件事,但是:重试节点和断路节点需要有关状态的其余部分的信息。要获取该信息,我们需要背压。

施加背压是为什么除了在系统的末尾之外我们不会重试。如果我们将失败,我们希望将该失败信息传播到可以使用的位置。失败信息需要去的最重要的位置是到结束(通常,客户端)将原始请求制作到系统。但它同样需要通过实现电路中断的节点传播。在系统的中间尝试将重试策略置于掩盖来自节点的信息它需要的地方。

只要系统传播背压,我们讨论的负载还原策略都有他们需要工作的信息。

Backfress是一种组成策略,可以使用同样处理和施加背压的较大系统的Any Node可以与其他节点一起放置,并且您最终会使用处理和发挥背部压力的整个系统。

(当我们能够得到它们时,组成性质很棒。花点时间考虑幂等待 - 它不一定是构成的。我们必须以系统的方式考虑每个操作。)

所以,除了遵循端到端的原则而不是试图在系统中间隐藏失败,我们如何最终拧紧背压?

队列的第一个定律是:每个队列都应该具有最大大小.queues不得长期增长。

这是正确处理Backressure最常见的失败。即使消费者方面已经完全过载,也将继续接受生产者的输入。队列系统将死(毕竟,RAM和磁盘是隐式的上限......)但与此同时,背压被吃掉。队列假装一切都很好,而系统在其后面燃烧。

略有令人惊讶的是,往往是这种情况,当队列填补其隐式限制(RAM等)并且机器落下时,开发人员的响应是思考“啊,我们需要一个牛仔队员机器,显然它不可能处理负荷!“这几乎总是错误。第一个进球是确保队列不能崩溃,并且它在过载时正确地施加背压。在你不能正确确定的正确行动方案'从一个不仅自然错误设计的系统中收集性能数据。

背压是组成的,这意味着我们可以从其部件构建一个整体。但它确实有一个翻转侧:对于系统正确处理背压,每个部分必须这样做。在中间混乱中可能会有一个无限的队列整个系统的事情很有效。

第二次队列定律是:您是否认为最大大小为0?分布式系统中的大小零的队列是一个负载均衡器。“队列的”作业只是直接将制作人与消费者连接(客户端服务器)。(当然,这些服务器都有TCP接受队列......总是涉及的队列。但那些也有界限!)

令人惊讶的是,当实际上很少有理由这样做时,队列的频率如何队列队列队列是从同步到异步请求切换。当然,他们往往是达到的,但它们经常被视为某种东西乐于助人。他们应该被视为可能危险的东西。

没有什么比今天对问题进行平滑的队列更好,只是让他们在将来爆炸。

在队列中出色的谈话,有一些模拟和排队理论投掷:Zach Tell Dan - 一切都将流动。注意那些长尾!