计算机科学中的Bulkheading是什么?

26

我正在学习Akka中的调度程序,并了解到它用于隔离操作。在计算机科学中,什么是隔离操作?


4
谁曾经给这个有帮助的问题点踩,请不要过度反应,回到您自己的事情上。说实话,我不知道什么是Hystrix(也不在意),我来这里只是因为Akka,而这个问题正是我需要的。请不要改变原文的意思。 - Boris Burkov
2个回答

38

引用Jonas Bonér在2016年4月的一次主题演讲中的话:

隔离故障 - 能够将失败包容和管理而不会导致级联故障 - 这种模式有时被称为舱壁隔离

enter image description here

舱壁隔离几个世纪以来一直被用于船舶建造领域,将船分成隔离的密闭舱室,这样如果少数几个舱室充满水,泄漏就不会扩散,船只可以继续运行并到达目的地。

弹性 - 从故障中恢复的能力 - 取决于彼此隔离和故障的内容是否进行了分区和封装,并且只有通过摆脱同步通信的强耦合关系才能实现。


在Akka系统中,人们通常通过调度器的调整来实现舱壁隔离,正如Jamie Allen在博客文章中所述,以下是其中的一部分摘录:

Akka用户经常遇到的最大问题之一是如何使用调度程序来创建故障区域,并防止应用程序的一部分的失败影响另一部分。有时被称为舱壁模式....

将演员分为失败区域的关键是确定他们的风险配置文件。任务是否特别危险,例如网络IO?是否需要阻塞的任务,例如数据库访问?在这些情况下,您希望将那些执行较少危险工作的演员和线程与那些执行更危险工作的演员和线程隔离开来。如果某个线程发生完全死亡并且无法从池中获得援助,孤立就是您唯一的保护,以便不相关的演员不会受到资源减少的影响。

您还可以通过分析识别计算量大的区域,并使用路由器(没有共享邮箱,因此没有工作窃取)和BalancingDispatcher(所有“routees”都有一个邮箱,因此具有工作窃取性质)等工具将这些任务拆分出来。对于指定给路由器的任务,您可能还希望它们在自己的调度程序上运行,以便进行强烈的计算任务不会使等待线程执行其工作的其他演员饥饿。

Akka文档还描述了使用调度程序管理阻塞的方法


除了调整调度程序外,在Akka中,人们还可以使用断路器(Circuit Breakers)来实现批量处理。 断路器是一种可配置的机制,用于防止连锁故障。文档提供了以下示例:

  

例如,我们有一个与远程第三方Web服务进行交互的Web应用程序。假设第三方已经超售自己的容量,并在负载下其数据库崩溃了。

假设数据库发生故障,导致向第三方 Web 服务返回错误信息需要很长时间,这反过来又使调用在很长一段时间后失败。回到我们的 Web 应用程序,用户已经注意到他们的表单提交似乎需要更长的时间,看起来像是挂起了。那么用户会按照他们所知道的方法使用刷新按钮,在已经运行的请求之上添加更多的请求。这最终会导致 Web 应用程序因资源耗尽而失败。这将影响所有用户,甚至包括不使用依赖于该第三方 Web 服务功能的用户。

引入断路器对 Web 服务调用进行控制,将导致请求开始快速失败,让用户知道出现了问题,并且不需要刷新其请求。这还将把故障行为限制在仅使用第三方功能的用户身上,其他用户不再受影响,因为不会出现资源耗尽。断路器还可以允许精明的开发人员标记使用该功能的网站部分不可用,或者在断路器打开时显示适当的缓存内容。

有没有线索可以解释为什么他们使用这个陌生的术语,而已经有广泛使用且被广泛理解的术语,比如“防火墙”和“沙盒”,可供使用呢? - gidds

12
解决方案:专门用于阻塞操作的调度程序 将阻塞行为隔离开来以便不影响系统其他部分的最有效方法之一是为所有这些阻塞操作准备并使用专门的调度程序。这种技术通常被称为“批量处理”或简称“隔离阻塞”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接