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

Posted

技术标签:

【中文标题】在非阻塞应用程序上应用 Bulkhead 模式的目的是啥?【英文标题】:What's the purpose of applying the Bulkhead pattern on a non-blocking application?在非阻塞应用程序上应用 Bulkhead 模式的目的是什么? 【发布时间】:2021-02-04 14:11:02 【问题描述】:

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

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

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

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

关于why using Circuit-Breaker and Bulkhead patterns with Reactor 还有另一个(更通用的)问题。这个问题的回答非常笼统,解释了为什么所有 Resilience4J 装饰器在使用 Reactor 时都是相关的。

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

【问题讨论】:

这能回答你的问题吗? Why use Circuit Breaker and Bulkhead when working with Spring Reactor? 感谢您回复@MartinTarjányi。我看到了这个问题,但我认为答案并不能真正解决我的疑问。我仍然不明白为什么我们需要单独的线程池,而它们的线程不会被阻塞。 【参考方案1】:

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

想想Little's law:L = λ * W

地点:

L – 队列系统中的平均并发任务数

λ – 每单位时间到达排队系统的平均任务数

W - 任务在排队系统中花费的平均服务时间

Bulkhead 模式更多的是关于控制L 以防止资源耗尽。这可以通过使用来完成:

有界队列 + 线程池 信号量

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

RateLimiter 模式是关于控制λ 和 TimeLimiter 是关于控制允许任务花费的最长时间。

自适应隔板甚至可以取代 RateLimiters。看看这个精彩的演讲"Stop Rate Limiting! Capacity Management Done Right" by Jon Moore"

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

【讨论】:

以上是关于在非阻塞应用程序上应用 Bulkhead 模式的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 命名管道流

windows下在非阻塞TCP套接字上使用SO_SNDBUF的奇怪行为

如何将 CircuitBreaker 与 TimeLimiter 和 Bulkhead 结合使用?

Hystrix 使用的 Bulkhead Pattern 是啥?

C++ 中的 Bittorrent 客户端,在非阻塞套接字上连接到对等点总是超时

Java NIO 学习--Selector