【发布时间】:2017-06-12 12:54:54
【问题描述】:
我使用 Asp.Net Core Web Application (.Net Core) 模板创建了一个 dotnet core web api,该模板为我们提供了 api/values 控制器,并且在帖子中我使用 Windows Azure Storage library v8 向 azure storage queue 发送消息.0. https://www.nuget.org/packages/WindowsAzure.Storage/8.0.0
目前,当我执行单个请求时,队列大约需要一个 avg。完成 AddMessageAsync() 方法需要 140 毫秒,但是当我对每秒 200 个请求进行负载测试时,相同的方法平均需要 800 毫秒才能完成。根据 azure storage queue,它应该能够每秒处理 2000 个请求,但我无法每秒处理 200 个请求。
如果有人能提供一些信息说明为什么 web 应用程序 api 没有按预期运行,我将不胜感激。
请看下面我的代码示例
Startup.cs - ConfigureServices()
// Add QueueAccessLayer.
services.AddSingleton<IQueueAccessLayer, QueueAccessLayer>();
电子邮件控制器.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);
}
【问题讨论】:
-
RPS也受WebApp限制,请尝试change tier or scale out of App service plan查看RPS是否有改善?
-
目前我的 Web 应用程序在 docker 容器中本地运行。
-
我明白,但如果我评论这一行 await _queue.SendMessage(emailMessage);我每秒收到大约 1814 个请求,平均响应时间为 72 毫秒。有了上面我得到 152 rps 和 600ms 平均响应。
-
Azure 存储还是本地存储模拟器?如果您使用的是 Azure 存储,请尝试使用 local storage emulator 进行测试。
-
我已经使用本地存储进行了测试,它可以正常工作,获得 200 rps 和 26 毫秒的平均响应,但是如果我更改为云队列,我会看到问题。
标签: c# asp.net azure .net-core azure-queues