从EventHub获取数据会延迟

时间:2016-11-28 06:56:22

标签: azure windows-services azure-eventhub

我在Azure中配置了一个EventHub,也是一个用于读取数据的使用者组。它工作好几天了。突然间,我看到传入数据有延迟(大约3天)。我使用Windows服务来使用服务器中的数据。我每分钟有大约500条传入消息。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分: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只是我用来将信息写入blob存储的一些日志记录类。

现在输出

之类的消息
  

上次处理的seqnr for partition 3:32780931 of 32823804 in consumergroup'遥测' (滞后: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);
        }
}