【问题标题】:Why calls from the same client are not executed at the same time为什么来自同一个客户端的调用不会同时执行
【发布时间】:2019-08-20 18:07:31
【问题描述】:

我有一个只有两行代码的天蓝色函数,首先是等待 Task.Delay(5000),其次是返回状态 Ok 给客户端。在 host.json 中设置了 maxOutstandingRequests 和 maxConcurrentRequests。 AF 在本地执行,我也尝试使用已部署的版本。当我尝试从同一个 HttpClient 发送多个请求时会出现问题,函数调用不会是异步的。每次调用的执行时间为 5、10、15、20 和 25 秒。当我使用 WebApi 而不是 AF(WebApi 控制器具有与 AF 相同的功能)运行相同的客户端代码时,每次调用的执行时间为 5 秒。我想知道如何使用 Azure 函数获得与使用 WebApi 相同的行为?

下面我提供了客户的代码。

class Program
{
       private static System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient();

       static void Main(string[] args)
       {
           IEnumerable<TimeSpan> result = Test(10);

           Console.WriteLine(string.Join("\n", result));
           Console.ReadLine();
       }

       private static IEnumerable<TimeSpan> Test(int taskCount)
       {
           Task<TimeSpan>[] tasks = new Task<TimeSpan>[taskCount];

           for (int i = 0; i < taskCount; i++)
                tasks[i] = Send();

           Task.WaitAll(tasks);

           return tasks.Select(t => t.Result);
       }

       private static async Task<TimeSpan> Send()
       {
           using (var request = new HttpRequestMessage(HttpMethod.Post, ConfigurationManager.AppSettings["AF"]))
           {
                Stopwatch sw = new Stopwatch();

                sw.Start();

                using (var response = await httpClient.SendAsync(request))
                {
                    sw.Stop();

                    return sw.Elapsed;
                }
           }
       }
   }

【问题讨论】:

  • 函数中的代码长什么样?
  • 还有maxOutstandingRequestsmaxConcurrentRequest 的值?
  • @Turbo public static async Task Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "AF")]HttpRequestMessage req, TraceWriter log) { await Task .延迟(5 * 1000);返回 req.CreateResponse(HttpStatusCode.OK); }
  • @Turbo 值为 50

标签: c# azure-functions httpclient


【解决方案1】:

我针对这个问题做了一些研究。首先,我在您客户端的代码中添加了一行代码“Console.WriteLine("--" + sw.Elapsed);”。

然后运行这段代码,我看到同时打印了 10 个秒表开始时间。

所以这就是 5s、10s、15s、20s 和 25s 结果的原因。

之后,如果我们要测试azure函数的异步任务,我们必须在host.json中添加属性(我想你已经完成了)

然后我在 Visual Studio 中运行客户端的代码,得到的结果如下图所示。

我不确定你是否有同样的问题。如果您遇到与上面的屏幕截图相同的问题。您可以安装 Fiddler4(因为根据一些研究,它可能是由代理引起的)。所以我安装了 Fiddler4,然后再次在 Visual Studio 中运行客户端的代码。 它显示代码成功发送了 10 个请求,返回的 sw.Elapsed time 符合我们的预期。

10行6.xx秒证明了azure函数异步运行任务。

【讨论】:

  • 6.5s 是很多时间。我们的 AF 睡眠时间为 5 秒,因此我们预计每次调用的结果最多约为 5.5 秒。如果我们为 WebApi 运行相同的客户端代码,我们将得到 ~5.5s 的结果,或者如果我们更改客户端的代码,它为每次调用使用新的 HttpClient 而不是一个静态 HttpClient,我们将在 AF 中得到 ~5.5s 的结果。我想用一个静态 HttpClient 和 WebApi 一样获得约 5.5 秒的结果。
  • 存在延迟。您是否检查过您托管 AF 的地区?
  • @ImranArshad 是的,我做到了。如果每次调用都使用新的 HttpClient,我可以得到大约 5.5 秒的结果,但我想使用一个静态 HttpClient。
  • 嗨@hehe,我将位置更改为与我的AF相同并进行测试。结果是 5.6~5.7 秒。
  • @HuryShen 结果约为 5.5 秒。我运行了两次客户的代码,结果是 6-7 秒,但第二次运行后的结果是 ~5.5 秒。抱歉,我在写评论之前没有多次检查。关于这个解决方案,我有两个问题。 1. 如果我将 taskCount 从 10 更改为例如 500(maxOutstandingRequests 和 maxConcurrentRequest 也更改),结果将是 ~10s。为什么? 2. 我们可以在没有 fiddler 的情况下获得相同的行为,因为它是客户端的代码,而客户不会有 fiddler?我们可以更改 AF 设置,使其可以接收来自一个 HttpClient 的请求,或者我们可以更改客户端以在没有 fiddler 的情况下工作吗?
猜你喜欢
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2019-03-31
  • 2012-05-31
  • 2014-08-09
  • 2010-12-25
相关资源
最近更新 更多