微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在非阻塞应用程序上应用“隔壁”模式的目的是什么?

如何解决在非阻塞应用程序上应用“隔壁”模式的目的是什么?

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

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

如果有人可以澄清这一点,我会很感激。

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

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

另一方面,我的问题是针对Bulkhead模式的,因为我不了解在不阻塞线程的情况下它的好处。

解决方法

“隔板”模式不仅与隔离线程池有关。

想到Little's lawL = λ * W

位置:

L –排队系统中的平均并行任务数

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

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

“隔板”模式更多地是为了防止资源耗尽而控制L。可以使用以下方法完成:

  • 边界队列+线程池
  • 信号量

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

RateLimiter模式用于控制λ,而TimeLimiter模式用于控制允许任务花费的最大时间。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。