c# - Azure 事件中心 : Send Async performance

标签 c# azure .net-core azure-eventhub

我的代码非常简单:

    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/

相关文章:

c# - 删除 "/*"和 "*/"之间的文本( block 注释)

c# - 来自 C# 的警报消息

c# - AAD : How uniquely identify users in a Web API?

python - Azure blob - 直接存储到存档层

azure - 对于长时间运行的 CPU 密集型任务,在 Web 作业和 azure 函数之间进行选择

mysql - 向远程 MySql 服务器添加数据时发生错误

c# - 我的自定义 DbExecutionStrategy 没有被调用

c# - 如何将 BUTTON 值插入数据库

dependency-injection - 来自 Autofac 模块的 Net Core : access to appsettings. json 值

c# - 如何从 .net 中的 MySql 过程中选择输出参数