我的代码非常简单:
public async Task Produce(string topic, object message, MessageHeader messageHeaders)
{
try
{
var producerClient = _EventHubProducerClientFactory.Get(topic);
var eventData = CreateEventData(message, messageHeaders);
messageHeaders.Times?.Add(DateTime.Now);
await producerClient.SendAsync(new EventData[] { eventData });
messageHeaders.Times?.Add(DateTime.Now);
//.....
Log.Info($"Milliseconds spent: {(messageHeaders.Times[1]- messageHeaders.Times[0]).TotalMilliseconds});
}
}
private EventData CreateEventData(object message, MessageHeader messageHeaders)
{
var eventData = new EventData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)));
eventData.Properties.Add("CorrelationId", messageHeaders.CorrelationId);
if (messageHeaders.DateTime != null)
eventData.Properties.Add("DateTime", messageHeaders.DateTime?.ToString("s"));
if (messageHeaders.Version != null)
eventData.Properties.Add("Version", messageHeaders.Version);
return eventData;
}
在日志中我有近 1 秒(~ 800 毫秒)的值 执行时间这么长的原因可能是什么?
最佳答案
EventHubProducerClient
延迟打开与事件中心服务的连接,等待直到操作第一次需要它。在您的代码片段中,对 SendAsync
的调用会触发创建 AMQP 连接、创建 AMQP 链接并执行身份验证。
除非客户端关闭,否则大多数 future 的调用都不会产生该开销,因为连接和链接是持久的。 大多数是该语句中的一个重要区别,因为客户端可能需要在遇到网络错误、事件较低且连接空闲时或者事件中心服务终止连接时重新连接/链接。
正如 Serkant 提到的,如果您想了解时间安排,最好使用像 Benchmark.NET
这样的库。经过大量迭代才能得出具有统计意义的结果。
关于c# - Azure 事件中心 : Send Async performance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66921507/