这是我的舱壁政策:
BulkheadPolicy = Policy
.BulkheadAsync(maxParallelization: 2,
maxQueuingActions: 2, onBulkheadRejectedAsync: (context) =>
{
Console.WriteLine("Rejected");
return Task.CompletedTask;
}); 它应该只允许4个并发任务执行/等待执行。
然而,我最终得到了6个任务,能够通过舱壁策略。
这是我的控制器动作:
[HttpGet("bulkhead")]
public async Task<object> Bulkhead()
{
Console.WriteLine(DateTime.UtcNow);
var bhCount = _policyManager.BulkheadPolicy.BulkheadAvailableCount;
var queueCount = _policyManager.BulkheadPolicy.QueueAvailableCount;
// The policy is used here
await _policyManager.BulkheadPolicy.ExecuteAsync(async (context) =>
{
await Task.Delay(10000);
}, new Context());
return new
{
bhCount,
queueCount
};
}在我的浏览器中,我使用这个脚本模拟14个并发任务:
for (var i = 0; i < 14; i++) {
fetch('https://localhost:44313/api/Bulkheads/bulkhead')
.then(result=>console.log(result));
}这只会产生4个200OK反应。然而,我最终得到了6个200OK响应。我做了多次测试,得到了同样的结果。有谁知道为什么同样的行为在控制台应用程序中工作得很好呢?我错过了什么吗?非常感谢。
更新1:这是我的IPolicyManager接口
public interface IPolicyManager
{
AsyncBulkheadPolicy BulkheadPolicy { get; }
}
public class PolicyManager : IPolicyManager
{
public PolicyManager()
{
Init();
}
public AsyncBulkheadPolicy BulkheadPolicy { get; private set; }
private void Init()
{
BulkheadPolicy = Policy
.BulkheadAsync(maxParallelization: 2,
maxQueuingActions: 2, onBulkheadRejectedAsync: (context) =>
{
Console.WriteLine("Rejected");
return Task.CompletedTask;
});
}
}UPDATE 2:当我发送一个固定的请求(固定URL)时,它失败得非常慢,但是当我在请求中添加一个随机参数时,结果就像预期的那样(快速失败,只有4个请求可以继续进行)。
for (var i = 0; i < 14; i++) {
fetch('https://localhost:44313/api/Bulkheads/bulkhead?count=' + i)
.then(result=>console.log(result));
}发布于 2021-08-03 12:25:49
事实证明,浏览器的行为并不像预期的那样。我编写了一个控制台应用程序,它执行相同的任务,并且运行良好:快速失败,一次只能执行4个请求。所以我可以确认这不是来自Polly或ASP.NET Core的问题。可能与web浏览器的缓存机制有关(我正在使用边缘):https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching
https://stackoverflow.com/questions/68624438
复制相似问题