首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASP.NET内核中使用Polly舱壁意外行为

在ASP.NET内核中使用Polly舱壁意外行为
EN

Stack Overflow用户
提问于 2021-08-02 15:43:10
回答 1查看 436关注 0票数 1

这是我的舱壁政策:

代码语言:javascript
复制
BulkheadPolicy = Policy
    .BulkheadAsync(maxParallelization: 2,
        maxQueuingActions: 2, onBulkheadRejectedAsync: (context) =>
        {
            Console.WriteLine("Rejected");
            return Task.CompletedTask;
        });         

它应该只允许4个并发任务执行/等待执行。

然而,我最终得到了6个任务,能够通过舱壁策略。

这是我的控制器动作:

代码语言:javascript
复制
[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个并发任务:

代码语言:javascript
复制
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接口

代码语言:javascript
复制
    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个请求可以继续进行)。

代码语言:javascript
复制
for (var i = 0; i < 14; i++) {
    fetch('https://localhost:44313/api/Bulkheads/bulkhead?count=' + i)
        .then(result=>console.log(result));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-03 12:25:49

事实证明,浏览器的行为并不像预期的那样。我编写了一个控制台应用程序,它执行相同的任务,并且运行良好:快速失败,一次只能执行4个请求。所以我可以确认这不是来自Polly或ASP.NET Core的问题。可能与web浏览器的缓存机制有关(我正在使用边缘):https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68624438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档