2016-06-27 1 views
1

내 api (C#)에서 현재 많은 요청 (15-20 초)에 응답하고 있습니다. 이제 이벤트 허브에 데이터를 보내려고합니다. 하지만 푸른 하늘 이벤트 허브에 데이터를 전송하는 사용자를 지연시키고 싶지 않습니다. 그래서 하늘에 내 애플 리케이션을 보내는 동안 사용자가 내 대답을 기다리고 싶지 않아 이벤트 허브 beacuse 비동기 요청을 할 필요가있다. 가능한 한 빨리 응답을 보내야하며, 푸른 색은 2-3 초 정도 지속될 수 있습니다.async azure 이벤트 허브 데이터 메서드를 보냅니다.

나는 어떻게 성공할 수 있습니까? 나는 잘했다. 그러나 didnt는 내가 원하는 것을 얻는다. 내 코드 :

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 ""; 
} 

와 나는 전화처럼이 방법 : 내가 생각/

답변

0

: 당신이 볼 수 있듯이

static async void method() 


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

이있다 "thread.sleed"코드는하지만 난 7 초 기다렸다 좋은 방법으로 async/await를 실제로 사용하는 방법에 대해 자세히 알아야합니다. 차단 코드로 비동기 코드를 혼합합니다. 다시 질문에, 이제

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

:

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 ""; 
} 

호출 코드가 있어야한다 :

올바른 코드는 다음과 같이해야한다. 현재 코드는 모든 메시지가 이벤트 허브로 보내지고 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