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