C# 结合使用HttpClient和NServiceBus的严重延迟
我正在使用NServiceBus进行集成POC。此集成在发生事件时向API发出通知 这一切都是可行的,但当执行并发http请求时,会出现严重的性能问题 我配置了一个端点,它完成一件事:向RESTAPI发送json请求(通知) 我的设置: 端点(framework 4.6.1)有一个静态HttpClient,在程序启动时只初始化一次:C# 结合使用HttpClient和NServiceBus的严重延迟,c#,nservicebus,dotnet-httpclient,C#,Nservicebus,Dotnet Httpclient,我正在使用NServiceBus进行集成POC。此集成在发生事件时向API发出通知 这一切都是可行的,但当执行并发http请求时,会出现严重的性能问题 我配置了一个端点,它完成一件事:向RESTAPI发送json请求(通知) 我的设置: 端点(framework 4.6.1)有一个静态HttpClient,在程序启动时只初始化一次: internal static void Intitialize() { ServicePointManager.Defau
internal static void Intitialize()
{
ServicePointManager.DefaultConnectionLimit = 100;
var apiSettings = NotificationEngineManager.GetInterfaceSettings()?.API;
NotificationClient = new HttpClient();
NotificationClient.Timeout = TimeSpan.FromSeconds(45);
if (!string.IsNullOrEmpty(apiSettings.UserName))
{
var byteArray = Encoding.ASCII.GetBytes($"{apiSettings.UserName}:{apiSettings.Password}");
NotificationClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
}
}
internal static HttpClient NotificationClient { get; set; }
负责发布请求的我的处理人:
public async Task Handle(EventRegistered message, IMessageHandlerContext context)
{
var apiSettings = NotificationEngineManager.GetInterfaceSettings()?.API;
if (apiSettings == null)
{
throw new BusinessException("No valid API settings found");
}
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.NullValueHandling = NullValueHandling.Ignore;
settings.DateFormatString = "s";
settings.Converters.Add(new StringEnumConverter { });
try
{
var jsonRequest = JsonConvert.SerializeObject(message.Notification, settings);
var response = await HttpClients.NotificationClient.PostAsync(apiSettings.Endpoint, new StringContent(jsonRequest, Encoding.UTF8, "application/json"));
response.EnsureSuccessStatusCode();
}
catch (TaskCanceledException)
{
throw new Exception("Notifiaction Request timed out.");
}
await context.Publish(new NotificationSent(message, DateTime.Now)).ConfigureAwait(false);
}
问题:
NServiceBus端点同时处理10条消息,这意味着同时处理10个http post请求
RESTAPI大约需要0.2秒来响应1条消息。但同时触发10个HTTPPOST请求大约需要35秒。
所有请求都在同一时间开始,但也都在同一时间结束,大约35秒后
使用netstat
命令,我可以看到10个打开的到API的tcp连接。因此,HttpClient确实处理并发请求
奇怪的是,如果我将端点并发性设置为1,这意味着http请求是1对1处理的,那么所有10个请求都在2秒内处理完毕
如果我将端点并发级别设置为20或更多,几乎所有请求都会超时(超时=45秒)
可以使用HttpWebRequest而不是HttpClient复制相同的内容
我在这里不知所措。我错过了什么?看起来所有的请求都被删除了
在客户端或服务器上互相等待。任何帮助都是无效的
非常感谢
RESTAPI是运行在ISS(非express)上的基本.NET核心API
服务器端日志记录。
日志中间件添加到管道的开头
2018-04-18 09:05:38.7660 INFO Begin Request 6
2018-04-18 09:05:38.7850 INFO message 6 received
2018-04-18 09:05:38.8150 INFO End Request 6
2018-04-18 09:05:39.4036 INFO Begin Request 9
2018-04-18 09:05:39.4231 INFO message 9 received
2018-04-18 09:05:39.4551 INFO End Request 9
2018-04-18 09:05:39.7172 INFO Begin Request 10
2018-04-18 09:05:39.7512 INFO message 10 received
2018-04-18 09:05:39.7512 INFO Begin Request 8
2018-04-18 09:05:39.7812 INFO End Request 10
2018-04-18 09:05:39.8132 INFO message 8 received
2018-04-18 09:05:39.8302 INFO End Request 8
2018-04-18 09:05:40.0722 INFO Begin Request 1
2018-04-18 09:05:40.1097 INFO message 1 received
2018-04-18 09:05:40.1097 INFO Begin Request 5
2018-04-18 09:05:40.1413 INFO message 5 received
2018-04-18 09:05:40.1703 INFO End Request 1
2018-04-18 09:05:40.1913 INFO End Request 5
2018-04-18 09:05:40.4033 INFO Begin Request 3
2018-04-18 09:05:40.4403 INFO message 3 received
2018-04-18 09:05:40.4563 INFO End Request 3
2018-04-18 09:05:40.5173 INFO Begin Request 7
2018-04-18 09:05:40.5508 INFO message 7 received
2018-04-18 09:05:40.5663 INFO End Request 7
2018-04-18 09:05:41.0100 INFO Begin Request 4
2018-04-18 09:05:41.0470 INFO message 4 received
2018-04-18 09:05:41.0630 INFO End Request 4
2018-04-18 09:05:41.3535 INFO Begin Request 2
2018-04-18 09:05:41.3740 INFO message 2 received
2018-04-18 09:05:41.4080 INFO End Request 2
看看请求8。
请求是在代码.23中启动的。服务器在.39收到请求。因此有16秒的间隔。我使用System.Diagnostics和NLog记录了网络跟踪。 这导致了严重的性能下降
禁用System.Diagnostics解决了我的问题。这真的是REST API正在做的唯一事情吗?另外,您能否共享您的NServiceBus端点配置和代码初始化?如何测量表中的开始/停止值?我怀疑问题在于跨消息共享静态变量(HttpClient)。为什么不为每条消息创建一个HttpClient?@RamonSmits:是的,API实际上什么也不做,只是返回一个消息。开始时间是拾取消息的时间。停止时间是收到响应的时间。从我的网络跟踪中,我注意到所有请求都是一起生成的,并且都是同时发送的。发送部分大约在15秒后发生。请告诉我您在哪里禁用了System.Diagnostics。我在NServicebus、基于asp.net核心的端点和SQSTransport方面面临着完全相同的问题。我在使用System.net.Http跟踪httpRequest时也面临着同样的问题。我从System.Diagnostic配置文件中删除了跟踪。我现在添加了一个额外的HttpClientHandler来处理日志记录。在我的例子中,我使用的是我调用的开发环境http端点,但响应太慢。有一次,我切换到staging one,它开始流动:)
log.Info($"Start request {message.Event.Id.ToString()}");
var response = await HttpClients.NotificationClient.PostAsync(apiSettings.Endpoint, new StringContent(jsonRequest, Encoding.UTF8, "application/json"));
response.EnsureSuccessStatusCode();
log.Info($"Stop request {message.Event.Id.ToString()}");
2018-04-18 09:05:23.2886 INFO NOTIFY_WO_OUT 8 Start request
2018-04-18 09:05:23.2886 INFO NOTIFY_WO_OUT 10 Start request
2018-04-18 09:05:23.2886 INFO NOTIFY_WO_OUT 5 Start request
2018-04-18 09:05:23.2886 INFO NOTIFY_WO_OUT 2 Start request
2018-04-18 09:05:23.2886 INFO NOTIFY_WO_OUT 4 Start request
2018-04-18 09:05:23.6336 INFO NOTIFY_WO_OUT 6 Start request
2018-04-18 09:05:24.6329 INFO NOTIFY_WO_OUT 9 Start request
2018-04-18 09:05:25.6142 INFO NOTIFY_WO_OUT 1 Start request
2018-04-18 09:05:26.6544 INFO NOTIFY_WO_OUT 7 Start request
2018-04-18 09:05:27.6545 INFO NOTIFY_WO_OUT 3 Start request
2018-04-18 09:05:47.2034 INFO NOTIFY_WO_OUT 5 Stop request
2018-04-18 09:05:47.6285 INFO NOTIFY_WO_OUT 3 Stop request
2018-04-18 09:05:47.9855 INFO NOTIFY_WO_OUT 6 Stop request
2018-04-18 09:05:48.0550 INFO NOTIFY_WO_OUT 9 Stop request
2018-04-18 09:05:48.5226 INFO NOTIFY_WO_OUT 4 Stop request
2018-04-18 09:05:48.5526 INFO NOTIFY_WO_OUT 10 Stop request
2018-04-18 09:05:48.9987 INFO NOTIFY_WO_OUT 8 Stop request
2018-04-18 09:05:49.0347 INFO NOTIFY_WO_OUT 1 Stop request
2018-04-18 09:05:49.0647 INFO NOTIFY_WO_OUT 7 Stop request
2018-04-18 09:05:49.3017 INFO NOTIFY_WO_OUT 2 Stop request
2018-04-18 09:05:38.7660 INFO Begin Request 6
2018-04-18 09:05:38.7850 INFO message 6 received
2018-04-18 09:05:38.8150 INFO End Request 6
2018-04-18 09:05:39.4036 INFO Begin Request 9
2018-04-18 09:05:39.4231 INFO message 9 received
2018-04-18 09:05:39.4551 INFO End Request 9
2018-04-18 09:05:39.7172 INFO Begin Request 10
2018-04-18 09:05:39.7512 INFO message 10 received
2018-04-18 09:05:39.7512 INFO Begin Request 8
2018-04-18 09:05:39.7812 INFO End Request 10
2018-04-18 09:05:39.8132 INFO message 8 received
2018-04-18 09:05:39.8302 INFO End Request 8
2018-04-18 09:05:40.0722 INFO Begin Request 1
2018-04-18 09:05:40.1097 INFO message 1 received
2018-04-18 09:05:40.1097 INFO Begin Request 5
2018-04-18 09:05:40.1413 INFO message 5 received
2018-04-18 09:05:40.1703 INFO End Request 1
2018-04-18 09:05:40.1913 INFO End Request 5
2018-04-18 09:05:40.4033 INFO Begin Request 3
2018-04-18 09:05:40.4403 INFO message 3 received
2018-04-18 09:05:40.4563 INFO End Request 3
2018-04-18 09:05:40.5173 INFO Begin Request 7
2018-04-18 09:05:40.5508 INFO message 7 received
2018-04-18 09:05:40.5663 INFO End Request 7
2018-04-18 09:05:41.0100 INFO Begin Request 4
2018-04-18 09:05:41.0470 INFO message 4 received
2018-04-18 09:05:41.0630 INFO End Request 4
2018-04-18 09:05:41.3535 INFO Begin Request 2
2018-04-18 09:05:41.3740 INFO message 2 received
2018-04-18 09:05:41.4080 INFO End Request 2