在非阻塞应用程序上应用 Bulkhead 模式的目的是什么?

Rub*_*ace 3 project-reactor spring-webflux resilience4j

我对Bulkhead模式的理解是它是一种隔离线程池的方式。因此,与不同服务的交互使用不同的线程池:如果共享同一个线程池,一个服务不断超时可能会耗尽整个线程池,从而中断与其他(健康)服务的通信。通过使用不同的,可以减少影响。

根据我的理解,我认为没有任何理由将此模式应用于非阻塞应用程序,因为线程不会被阻塞,因此线程池也不会耗尽。

如果有人能澄清这一点,以防我遗漏了什么,我将不胜感激。

编辑(解释为什么它不重复):

还有另一个(更通用的)问题询问为什么将 Circuit-Breaker 和 Bulkhead 模式与 Reactor 一起使用。这个问题以非常通用的方式得到了回答,解释了为什么所有 Resilience4J 装饰器在使用 Reactor 时都是相关的。

另一方面,我的问题是隔板模式特有的,因为我不明白它在线程不被阻塞的情况下的好处。

小智 8

Bulkhead 模式不仅仅是隔离线程池。

\n

想想利特尔定律L = \xce\xbb * W

\n

在哪里:

\n

L\xe2\x80\x93 队列系统中的平均并发任务数

\n

\xce\xbb\xe2\x80\x93 每单位时间到达排队系统的平均任务数

\n

W\xe2\x80\x93 任务在排队系统中花费的平均服务时间

\n

Bulkhead 模式更多地是L为了防止资源耗尽而进行控制。这可以通过使用以下方法来完成:

\n
    \n
  • 有界队列+线程池
  • \n
  • 信号量
  • \n
\n

即使非阻塞应用程序也需要您可能想要限制的每个并发任务的资源。信号量可以帮助限制并发任务的数量。

\n

RateLimiter 模式用于控制\xce\xbb任务允许花费的最长时间,而 TimeLimiter 模式用于控制任务允许花费的最长时间。

\n

自适应隔板甚至可以取代速率限制器。看看Jon Moore 的精彩演讲“停止速率限制!容量管理做得正确”

\n

我们目前正在 Resilience4j 中开发 AdaptiveBulkhead,它可以动态调整任务的并发限制。该实现与 TCP 拥塞控制算法相当,后者使用加法增加/乘法减少 (AIMD) 方案来动态调整拥塞窗口。\n但是 AdaptiveBulkhead 当然与协议无关。

\n