我试图弄清楚为什么我的Web服务如此之慢,并找到使它响应更快的方法。当前不涉及自定义处理(即apicontroller操作返回一个非常简单的对象)的平均响应时间约为75毫秒。
[Route("Send")]
[HttpPost]
[AllowAnonymous)
public PrimitiveTypeWrapper<long> Send(WebsiteNotificationMessageDTO notification)
{
_messageBus.Publish<IWebsiteNotificationCreated>(new { Notification = notification });
return new PrimitiveTypeWrapper<long>(1);
}
此方法的主体耗时2ms。 Stackify告诉我AuthenticationFilterResult.ExecuteAsync方法有很多开销,但是由于它是asp.net,因此我认为无法对其进行优化。
RestClient实现如下所示。 HttpClientFactory返回带有必需标头和基本路径的新HttpClient实例。
public async Task<long> Send(WebsiteNotificationMessageDTO notification)
{
var result = await _httpClientFactory.Default.PostAndReturnAsync<WebsiteNotificationMessageDTO, PrimitiveTypeWrapper<long>>("/api/WebsiteNotification/Send", notification);
if (result.Succeeded)
return result.Data.Value;
return 0;
}
在后端Rest服务上尽快执行100个请求:
[HttpPost]
public async Task SendHundredNotificationsToMqtt()
{
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100; i++)
{
await _notificationsRestClient.Send(new WebsiteNotificationMessageDTO()
{
Severity = WebsiteNotificationSeverity.Informational,
Message = "Test notification " + i,
Title = "Test notification " + i,
UserId = 1
});
}
sw.Stop();
Debug.WriteLine("100 messages sent, took {0} ms", sw.ElapsedMilliseconds);
}
这平均需要7.5秒。
检查了REST服务和MVC网站上的可用线程数:
int workers;
int completions;
System.Threading.ThreadPool.GetMaxThreads(out workers, out completions);
两者均返回:
Workers: 8191
Completions: 1000
删除了所有RabbitMQ消息总线连接,以确保它不是罪魁祸首。我还从其余方法_messageBus.Publish<IWebsiteNotificationCreated>(new { Notification = notification });
中删除了messagebus publish方法,因此它所要做的就是在包装对象内部返回1。
后端的其余部分正在使用带有承载令牌身份验证的身份框架,并且为了消除其中的大部分,我还尝试将其余服务上的控制器操作标记为AllowAnonymous。
以发布模式运行项目:无更改
所有这些尝试之后,问题仍然存在,每个请求仍将花费大约+-75毫秒。这样低吗?
Web服务仍然很慢,这是不需花费昂贵的硬件升级就能达到的最快速度吗?还是我可以研究一下其他原因来弄清楚是什么使我的Web服务这么慢?