Resilience4j 信号量隔离与线程池隔离分别保护哪类资源,其超时和上下文传播语义有什么差异?
旗舰版来源:alibaba高级工程师Resilience4j熔断器超时取消与灰度回滚上下文传递线程池隔离
草稿
答案解析
可以把它们理解成两种不同维度的 Bulkhead。
信号量隔离(SemaphoreBulkhead) :限制某个受保护调用的并发数,主要保护下游服务、数据库连接、文件或其他临界资源,避免同时请求过多。它不会创建新的线程,业务代码仍然运行在调用方线程上,所以不能避免阻塞调用占满 Web 容器线程或事件循环线程。 线程池隔离(ThreadPoolBulkhead) :把调用提交到独立的、有界线程池中,通过最大线程数和队列长度限制执行资源,主要保护调用方线程池,避免慢调用或阻塞调用拖垮主线程池。队列满或线程数达到上限时会被拒绝,但排队本身也会增加延迟。
超时语义上有明显区别:
1. 信号量的 maxWaitDuration 只表示等待信号量许可的最长时间。拿到许可后,实际业务调用执行多久由调用本身决定,信号量不会自动中断它。如果要限制业务调用时间,需要额外配合 TimeLimiter。即使 TimeLimiter 返回超时,底层同步调用也不一定已经停止,可能仍然占用调用线程和信号量许可。 2. 线程池隔离本身也不是调用超时机制。它主要控制线程数和
登录后查看完整内容
