问题描述
我对Bulkhead模式的理解是,它是隔离线程池的一种方式。因此,与不同服务的交互使用不同的线程池:如果共享同一线程池,则一个服务不断超时可能会耗尽整个线程池,从而中断与其他(正常)服务的通信。通过使用不同的影响,可以减少影响。
基于我的理解,我认为没有任何理由将此模式应用于非阻塞应用程序,因为线程不会被阻塞,因此线程池也不会耗尽。
如果有人可以澄清这一点,我会很感激。
编辑(解释为什么它不是重复的):
还有另一个(更通用的)问题,询问why using Circuit-Breaker and Bulkhead patterns with Reactor。这个问题的回答非常通用,解释了为什么在使用Reactor时所有Resilience4J装饰器都是相关的。
另一方面,我的问题是针对Bulkhead模式的,因为我不了解在不阻塞线程的情况下它的好处。
解决方法
“隔板”模式不仅与隔离线程池有关。
想到Little's law:L = λ * W
位置:
L
–排队系统中的平均并行任务数
λ
–每单位时间到达排队系统的平均任务数
W
–任务在排队系统中花费的平均服务时间
“隔板”模式更多地是为了防止资源耗尽而控制L
。可以使用以下方法完成:
- 边界队列+线程池
- 信号量
即使非阻塞应用程序也可能需要限制每个并发任务的资源。信号量可以帮助限制并发任务的数量。
RateLimiter模式用于控制λ
,而TimeLimiter模式用于控制允许任务花费的最大时间。
自适应隔板甚至可以代替RateLimiters。看看这个很棒的演讲"Stop Rate Limiting! Capacity Management Done Right" by Jon Moore"
我们目前正在Resilience4j中开发AdaptiveBulkhead,它可以动态调整任务的并发限制。该实现方式可与TCP拥塞控制算法相媲美,后者使用加法增加/乘法减少(AIMD)方案来动态调整拥塞窗口。 但是AdaptiveBulkhead当然与协议无关。