关于理解分区租约到期

时间:2017-07-08 09:51:12

标签: azure azure-eventhub

我有一个包含4个分区和2个消费者组的事件中心。我有2个使用EventProcessor读取数据的webjobs。两者都适用于不同的消费者群体

我已经配置了这样的事件处理器:

        var host = new EventProcessorHost(
            Guid.NewGuid().ToString(),
            configurationManager.EventHubConfiguration.Path,
            configurationManager.EventHubConfiguration.ConsumerGroupName,
            configurationManager.EventHubConfiguration.ListenerConnectionString,
            configurationManager.StorageConfiguration.ConnectionString)
        {
            PartitionManagerOptions = new PartitionManagerOptions
            {
                AcquireInterval = TimeSpan.FromSeconds(10),
                RenewInterval = TimeSpan.FromSeconds(10),
                LeaseInterval = TimeSpan.FromSeconds(30)
            }
        };

        var options = EventProcessorOptions.DefaultOptions;
        options.MaxBatchSize = 250;

        await host.RegisterEventProcessorFactoryAsync(new PlanCareEventProcessorFactory(telemetryClient, configurationManager), options);
        return host;

在我的EventProcessor中,我会跟踪进度(跳过一些方法以保持简短和可读):

internal class PlanCareEventProcessor : IEventProcessor
{
    public Task OpenAsync(PartitionContext context)
    {
        namespaceManager = NamespaceManager.CreateFromConnectionString(configurationManager.EventHubConfiguration.ManagerConnectionString);

        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;

        var msg = $"Last processed seqnr for partition {context.Lease.PartitionId}: {currentSeqNo} of {lastSeqNo} in consumergroup '{context.ConsumerGroupName}' (lag: {delta})";
        telemetryClient.TrackTrace(new TraceTelemetry(msg, SeverityLevel.Information));
        telemetryClient.TrackMetric(new MetricTelemetry($"Partition_Lag_{context.Lease.PartitionId}_{context.ConsumerGroupName}", delta));
        return Task.CompletedTask;
    }

    public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> events)
    {
        progressCounter++;

        ...

        await LogProgress(context);
    }

    private async Task LogProgress(PartitionContext context)
    {
        if (progressCounter >= 100)
        {
            await CheckPointAsync(context);
            progressCounter = 0;
        }
    }
}

现在,我注意到在调用OpenAsyncCloseAsync的频率时,网络浏览器存在差异。对于其中一个消费者群体,大约每半小时一次,而对于另一个消费群体则是每分钟几次。

由于两个webjobs都使用相同的代码并且在同一个应用计划上运行,这可能是什么原因?

让我感到困扰,因为使用await CheckPointAsync(context)的检查点几乎从未为其中一个网络工作做过,因为它在租约消失之前没有达到阈值。

0 个答案:

没有答案