【问题标题】:send async azure event hub data method发送异步 Azure 事件中心数据方法
【发布时间】:2016-06-27 13:20:22
【问题描述】:

在我的 api (c#) 中,我目前正在回答很多请求(15-20 秒)。现在我想出于某些目的将数据发送到事件中心。但我不想延迟用户将数据发送到 azure 事件中心。所以我需要向事件中心发出异步请求,因为当我的应用程序将数据发送到天蓝色时,我不想让用户等待我的回答。我需要尽快发送响应,azure 可能会持续 2-3 秒。

我怎样才能成功? 我做了什么,但没有得到我想要的。我的代码:

public static async Task<string> SendEvents(List<object> messages)
{
    string eventHubName = "rcmds";

    var connectionString = GetServiceBusConnectionString();

    CreateEventHub(eventHubName, connectionString);

    var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);

    try
    {
        List<Task> tasks = new List<Task>();

        for (int i = 0; i < messages.Count; i++)
        {
            var serializedMessage = JsonConvert.SerializeObject(messages[i]);

            EventData data = new EventData(Encoding.UTF8.GetBytes(serializedMessage));

            // Mesajları Event Hub a yolla
            tasks.Add(eventHubClient.SendAsync(data));
        }

        Task.WaitAll(tasks.ToArray());
        System.Threading.Thread.Sleep(7000);
    }
    catch (Exception ex)
    {
        new ExceptionHandler(ex, "Event Hub Library Sender - SendEvents");
    }
    finally
    {
        eventHubClient.CloseAsync().Wait();
    }
    return "";
}

我把这个方法称为:

 static async void method()


 {
            List<object> list = new List<object>();
            list.Add("dogrudur");
            await Utilities.EventHub.Sender.SendEvents(list);
        }

如您所见,有“thread.sleed”代码但我等了 7 秒:/

【问题讨论】:

    标签: c# azure asynchronous asp.net-web-api azure-eventhub


    【解决方案1】:

    我认为您需要更多地了解如何以一种好的方式真正使用 async/await。您将异步代码与阻塞代码混合在一起。

    正确的代码应该是这样的:

    public static async Task<string> SendEvents(List<object> messages)
    {
        string eventHubName = "rcmds";
    
        var connectionString = GetServiceBusConnectionString();
    
        CreateEventHub(eventHubName, connectionString);
    
        var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);
    
        try
        {
            List<Task> tasks = new List<Task>();
    
            for (int i = 0; i < messages.Count; i++)
            {
                var serializedMessage = JsonConvert.SerializeObject(messages[i]);
    
                EventData data = new EventData(Encoding.UTF8.GetBytes(serializedMessage));
    
                // Mesajları Event Hub a yolla
                tasks.Add(eventHubClient.SendAsync(data));
            }
    
            await Task.WhenAll(tasks.ToArray());
            System.Threading.Thread.Sleep(7000);
        }
        catch (Exception ex)
        {
            new ExceptionHandler(ex, "Event Hub Library Sender - SendEvents");
        }
        finally
        {
            await eventHubClient.CloseAsync();
        }
    
        return "";
    }
    

    调用代码应该是:

    static async Task method()
     {
            List<object> list = new List<object>();
            list.Add("dogrudur");
            await Utilities.EventHub.Sender.SendEvents(list);
        }
    

    现在,回到问题。当前代码一直等待,直到所有消息都发送到事件中心,然后休眠 7 秒。在您调用方法中,您等待 SendEvents 方法,因此您的应用程序当然需要 7 秒 + 将数据发送到事件中心所需的时间。

    您可以做的是实施某种即发即弃的机制。去掉代码中的Thread.Sleep,修改调用方法如下:

    static void method()
    {
        List<object> list = new List<object>();
        list.Add("dogrudur");
        Utilities.EventHub.Sender.SendEvents(list);
    }
    

    该方法现在在继续之前将不再等待,但作为回报,您将永远不知道事件发送何时完成。一般来说,应避免使用“一劳永逸”的方法。

    您可以采取的另一个提高性能的重要步骤是批量发送事件。目前,每个事件都使用eventHubClient.SendAsync 发送,但也有eventHubClient.SendBatchAsync 方法(https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.sendbatchasync.aspx),因此您可以发送更少的大消息而不是包含多个事件,而不是发送大量小消息。请注意,尽管存在最大消息大小。

    有关使用批处理发送事件的示例实现,请参阅此文件中的方法private async Task SendAutoSizedBatchAsync(IEnumerable collection) https://github.com/DeHeerSoftware/SemanticLogging.EventHub/blob/master/SemanticLogging.EventHub/EventHubAmqpSink.cs

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 2020-06-12
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      相关资源
      最近更新 更多