0

0

c# Polly 的 Bulkhead Isolation(舱壁隔离)模式的实现和作用

煙雲

煙雲

发布时间:2026-01-03 12:51:41

|

839人浏览过

|

来源于php中文网

原创

BulkheadPolicy 是 Polly 中实现舱壁隔离的策略,通过 maxParallelization(最大并发数)和 maxQueuedActions(最大排队数)限制资源使用,超限即抛 BulkheadRejectedException,本质是物理隔离而非限流。

c# polly 的 bulkhead isolation(舱壁隔离)模式的实现和作用

什么是 Polly 的 BulkheadPolicy

BulkheadPolicy 是 Polly 中实现舱壁隔离(Bulkhead Isolation)的策略,它通过限制并发执行的请求数量和排队等待的请求数量,防止某个依赖故障或延迟拖垮整个调用方线程池或资源。它的核心不是重试或熔断,而是“物理隔离”——像轮船的舱壁一样,把失败控制在局部。

BulkheadPolicy 的两个关键参数:maxParallelizationmaxQueuedActions

创建 BulkheadPolicy 时必须指定这两个整数参数,它们共同定义了资源使用边界:

  • maxParallelization:最多允许多少个操作**同时执行**(即占用线程/任务)
  • maxQueuedActions:当所有并行槽位被占满时,最多允许多少个操作在队列中**等待执行**

超出这两个限制的调用会立即抛出 BulkheadRejectedException,而不是阻塞或排队无限等待。

var bulkhead = Policy.BulkheadAsync(
    maxParallelization: 5,
    maxQueuedActions: 10
);

注意:maxParallelization 不等于线程数(尤其在 async/await 场景下),它表示“同时处于 ExecuteAsync 执行上下文中的操作数量”。对 I/O 密集型操作,实际线程消耗远小于此值;但对 CPU 密集型或同步阻塞调用,它可能直接对应线程池租用数。

为什么不能只靠 Task.RunSemaphoreSlim

手动用 SemaphoreSlim 或线程池限流,容易漏掉几个关键点:

堆友
堆友

Alibaba Design打造的设计师全成长周期服务平台,旨在成为设计师的好朋友

下载
  • 不自动区分“执行中”和“排队中”,无法统一拒绝超限请求
  • 异常处理分散:你得自己捕获 WaitAsync 超时、手动抛出业务一致的拒绝异常
  • 无法与 Polly 其他策略(如 RetryPolicyCircuitBreakerPolicy)自然组合
  • 缺少内置指标(如当前排队数、拒绝计数),调试和监控成本高

BulkheadPolicy 把这些封装进统一的 ExecuteAsync 接口,且支持 PolicyWrap 组合:

var policyWrap = Policy.WrapAsync(bulkhead, retry, breaker);

常见误用和坑点

舱壁策略最容易被当成“限流器”滥用,但它本质是**资源隔离机制**,不是速率控制器:

  • 它不感知时间窗口(不像令牌桶),所以不能替代 RateLimitPolicy
  • 如果内部操作本身是同步阻塞(如 Thread.Sleep),maxParallelization 会快速耗尽线程池,导致后续请求即使没超限也因无可用线程而卡死
  • maxQueuedActions 设为 0 并不意味着“不排队”,而是“拒绝所有排队请求”——此时一旦 5 个并发满,第 6 个调用立刻抛 BulkheadRejectedException
  • 异步操作中,不要在 ExecuteAsync 内部再用 .Wait().Result,这会破坏异步流并可能导致死锁或线程饥饿

真正需要舱壁的场景,是调用外部不稳定服务(如第三方 HTTP API、数据库查询),且你明确知道该服务的吞吐瓶颈或连接池上限。盲目加舱壁反而增加延迟和拒绝率。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

995

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

53

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

248

2025.12.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

473

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

55

2025.12.01

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

338

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2068

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

346

2023.08.31

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

189

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号