2016-11-28 82 views
0

我有一個在Azure中配置的EventHub,也是一個用於讀取數據的使用者組。它在一些日子裏工作正常。突然間,我看到傳入數據有所延遲(大約3天)。我使用Windows服務來使用服務器中的數據。每分鐘有大約500條傳入消息。任何人都可以幫我解決這個問題嗎?從EventHub獲取數據被延遲

+0

你是如何從eventhub讀取數據的?你使用IEventProcessor實例嗎? –

+0

@PeterBons是Peter,我正在使用IEventProcessor實例。 – vishnu

回答

1

可能是您正在處理它們的項目太慢。因此,要完成的工作會增加,你會落後。

要獲得一些見解,你是在事件流,你可以使用這樣的代碼:

private void LogProgressRecord(PartitionContext context) 
{ 
    if (namespaceManager == null) 
     return; 

    var currentSeqNo = context.Lease.SequenceNumber; 
    var lastSeqNo = namespaceManager.GetEventHubPartition(context.EventHubPath, context.ConsumerGroupName, context.Lease.PartitionId).EndSequenceNumber; 
    var delta = lastSeqNo - currentSeqNo; 

    logWriter.Write(
      $"Last processed seqnr for partition {context.Lease.PartitionId}: {currentSeqNo} of {lastSeqNo} in consumergroup '{context.ConsumerGroupName}' (lag: {delta})", 
      EventLevel.Informational); 
} 

的namespaceManager是建立這樣的:

namespaceManager = NamespaceManager.CreateFromConnectionString("Endpoint=sb://xxx.servicebus.windows.net/;SharedAccessKeyName=yyy;SharedAccessKey=zzz"); 

我把這種記錄方法該CloseAsync方法:

public Task CloseAsync(PartitionContext context, CloseReason reason) 
{ 
    LogProgressRecord(context); 

    return Task.CompletedTask; 
} 

logWriter只是一些loggi ng類我曾經寫信息到blob存儲。

現在輸出像

最後處理seqnr消息分區3:32780931的在consumergroup '遙測' 32823804(滯後:42873)

所以當滯後是你可以非常高正在處理很久以前發生的事件。在這種情況下,您需要擴大/縮小處理器。

如果您發現滯後,您應該測量處理給定數量的物品需要多長時間。然後,您可以嘗試優化性能並查看是否有所改進。我們這樣做了:

public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> events) 
{ 
     try 
     { 
      stopwatch.Restart(); 

      // process items here 

      stopwatch.Stop(); 

      await CheckPointAsync(context); 

      logWriter.Write(
       $"Processed {events.Count()} events in {stopwatch.ElapsedMilliseconds}ms using partition {context.Lease.PartitionId} in consumergroup {context.ConsumerGroupName}.", 
       EventLevel.Informational); 
     } 
} 
+0

謝謝Peter寶貴的時間..我沒有任何昂貴的數據處理器操作。我只需使用EF將傳入記錄插入到平坦表格中。我剛剛檢查了滯後現象,每個分區超過100000(有4個分區)。是否有可能運行我的Windows服務的多個實例並彌補滯後? – vishnu

+1

是的,但請注意,根據數據庫的不同,EF /數據庫可能無法處理負載。每秒500條消息並不多。你應該測量你的操作時間。查看更新的答案。 –

+0

是的。但是我有一個25的批量更新。可能25是一個小數字,我會檢查。在這兩者之間,消費者羣體的活躍聽衆數是否有限制?因爲我還計劃製作更多的實例。在VS中,如果我嘗試運行已經運行的用戶組一段時間,它會引發致命錯誤。 – vishnu