我对舱壁模式的理解是,这是一种隔离线程池的方法。因此,与不同服务的交互使用不同的线程池:如果同一个线程池是共享的,一个服务超时可能会不断耗尽整个线程池,从而中断与另一个(健康)服务的通信。通过使用不同的方法,减少了影响。
根据我的理解,我认为没有理由将这种模式应用于非阻塞应用程序,因为线程不会被阻塞,因此线程池也不会被耗尽。
如果有人能澄清这一点,我将不胜感激,以防我遗漏了什么。
编辑(解释为什么它不是副本):
还有一个(更通用的)问题是关于为什么在反应堆中使用断路器和舱壁模式?的。这个问题以一种非常普遍的方式得到了回答,解释了为什么所有的Resilience4J装饰师在使用反应堆时都是相关的。
另一方面,我的问题对于舱壁模式来说是特殊的,因为我不理解它在线程不会被阻塞的情况下的好处。
发布于 2020-10-23 07:58:51
舱壁模式不仅仅是隔离线程池。
想想小定律:L = λ * W
其中:
L -排队系统中并发任务的平均数量
λ -每单位时间到达排队系统的平均任务数
W -任务在排队系统中的平均服务时间
舱壁模式更多的是控制L,以防止资源枯竭。这可以通过以下方法实现:
即使是非阻塞应用程序也需要每个并发任务所需的资源,而您可能需要限制这些资源。信号量可以帮助限制并发任务的数量。
RateLimiter模式是关于控制λ,而TimeLimiter是关于控制任务允许花费的最大时间。
自适应舱壁甚至可以取代RateLimiters。看看这个很棒的演讲,“停止速率限制!容量管理做得对”乔恩·摩尔“
我们目前正在Resilience4j中开发一个Resilience4j,它动态地适应任务的并发限制。该算法的实现与TCP拥塞控制算法相当,TCP拥塞控制算法采用加性加/乘减少(AIMD)方案动态调整拥塞窗口。但AdaptiveBulkhead当然是与协议无关的。
https://stackoverflow.com/questions/64467344
复制相似问题