Azure存储队列性能不佳 - 仅200 RPS

时间:2017-01-26 22:08:27

标签: c# asp.net azure .net-core azure-queues

我使用Asp.Net核心Web应用程序(.Net Core)模板创建了一个dotnet核心web api,该模板为我们提供了api / values控制器,在帖子上我使用Windows Azure存储库v8向azure存储队列发送消息0.0。 https://www.nuget.org/packages/WindowsAzure.Storage/8.0.0

目前,当我执行单个请求时,队列需要大约平均值。 140ms来完成方法AddMessageAsync()但是当我每秒进行200次请求的负载测试时,相同的方法平均需要800ms才能完成。根据azure存储队列,它应该能够每秒处理2000个请求,但我无法每秒获得200个请求。

如果有人提供一些信息作为web应用程序api无法按预期执行的原因,我将不胜感激。

请参阅下面的代码示例

Startup.cs - ConfigureServices()

// Add QueueAccessLayer.
services.AddSingleton<IQueueAccessLayer, QueueAccessLayer>();

Emailcontroller.cs

[Route("api/[controller]")]
public class EmailController : Controller
{
    private IQueueAccessLayer _queue;

    public EmailController(IQueueAccessLayer queue)
    {
        _queue = queue;
    }

    // POST api/values
    [HttpPost]
    public async Task<IActionResult> Post([FromBody]string value)
    {
        var emailMessage = "Message Id - " + Guid.NewGuid();
        await _queue.SendMessage(emailMessage);
        return new EmptyResult();
    }
}

QueueAccessLayer.cs

public class QueueAccessLayer : IQueueAccessLayer
{
    private CloudQueueClient _queueClient;         
    private CloudStorageAccount _storageAccount;

    private CloudQueue _emailQueue;
    private ILogger<QueueAccessLayer> _logger;


    public QueueAccessLayer(ILogger<QueueAccessLayer> logger)
    {
        _storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=test1;AccountKey=#####;");
        _queueClient = _storageAccount.CreateCloudQueueClient();
        _emailQueue = _queueClient.GetQueueReference("emailqueue");
        _emailQueue.CreateIfNotExistsAsync().Wait();

        _logger = logger;
    }

    public async Task<bool> SendMessage(string msg)
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        CloudQueueMessage message = new CloudQueueMessage(msg);
        await _emailQueue.AddMessageAsync(message);
        watch.Stop();

        _logger.LogInformation(msg + " - " + watch.ElapsedMilliseconds + "ms");
        return true;
    }
}

public interface IQueueAccessLayer
{
    Task<bool> SendMessage(string msg);
}

1 个答案:

答案 0 :(得分:0)

确保在应用程序启动时设置以下内容:

  1. ServicePointManager.Expect100Continue = false;
  2. ServicePointManager.UseNagleAlgorithm = false;
  3. Expect100Continue设置为false - 在发送请求时会减少到服务器端的往返。

    UseNagleAlgorithm设置为false - 将关闭Nagle优化并显着提高性能。

    有一个很棒的博客可以解释这一点:Nagle’s Algorithm is Not Friendly towards Small Requests

      

    Nagling是发送方的TCP优化,旨在通过将小型发送请求合并到更大的TCP段来减少网络拥塞......这可以通过阻止小段来实现,直到TCP有足够的数据来传输完整大小段或所有未完成的数据都已被接收方确认...测试作为工作者角色运行,访问我们在同一地理位置的存储帐户。它插入长度为480字节的消息。结果显示,当Nagling关闭时,平均延迟提高了600%以上