Рабочая роль - EventProcessorHost CheckPoint кажется причиной 409 Конфликт хранилища Azure

У меня есть облачный сервис и концентратор событий с 2 ​​разделами. Моя облачная служба - это рабочая роль, которая записывает данные в хранилище Azure. Он записывает все сообщения, полученные от концентратора событий.

С эмулятором Azure моя рабочая роль работает нормально, она пишет в хранилище Azure в производственном режиме (не в dev, поэтому это то же хранилище Azure).

Когда я перенес свою рабочую роль в облачную службу, я получаю такую ​​ошибку от Application Insight (100% успешного вызова: false). С журналами IntelliTrace я получил конфликт 409.

Я попытался выполнить удаленную отладку, но она настолько медленная, что мне понадобится меньше времени, чтобы переписать мой код, чем ждать "следующего шага"...

Я удалил все управление арендой в моем коде, и ничего не изменилось...

Я твердо верю, что это связано с проблемой контрольно-пропускного пункта..

_host = new EventProcessorHost(Environment.MachineName, eventHubName, consumerGroupName, eventHubConnectionString, checkpointConnectionString);

Я использую мою контрольную точку в этом методе (в моем HandledEventProcessor)

    public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> events)
    {
        try
        {
            foreach (EventData eventData in events)
            {
                var eventName = eventData.GetEventName();
                var handlers = _handlerFactory.GetHandlers(eventName);
                if (handlers.Any())
                {
                    foreach (var handler in handlers)
                    {
                        SafelyHandleEvent(handler, eventName, eventData, context);
                    }
                }
                else
                {
                    _log.WarnEvent("NoEventHandlers",
                        new Facet { Name = "eventName", Value = eventName });
                }
            }
            await context.CheckpointAsync(); <--- Checkpoint here
        }
        catch (Exception ex)
        {
            _log.ErrorEvent("ProcessEventsFailed", ex,
                new Facet { Name = "eventCount", Value = events.Count() },
                new Facet { Name = "eventHubPath", Value = context.EventHubPath },
                new Facet { Name = "partitionId", Value = context.Lease.PartitionId });
        }
    }

Журналы Application Insight

23/4/2016 10:35:01 - ЗАВИСИМОСТЬ BLOB-объекта Azure: myblobStorage/myContainer Продолжительность зависимости: 2,84 мс Успешный вызов: ложный URL: https: //****.blob.core.windows.net: 443 / myContainer / myConsumerGroupName / partition1

23/4/2016 10:35:01 - ЗАВИСИМОСТЬ BLOB-объекта Azure: myblobStorage/myContainer Продолжительность зависимости: 2,84 мс Успешный вызов: ложный URL: https: //****.blob.core.windows.net: 443 / myContainer / myConsumerGroupName / partition0

23/4/2016 10:34:59 - ЗАВИСИМОСТЬ BLOB-объекта Azure: myblobStorage/myContainer Продолжительность зависимости: 4,4 мс Успешный вызов: falseURL: https://****.blob.core.windows.net:443/myContainer/myConsumerGroupName/1? = Comp аренда и тайм-аут =10

23/4/2016 10:34:59 - ЗАВИСИМОСТЬ BLOB-объекта Azure: myblobStorage/myContainer Продолжительность зависимости: 4,4 мс Успешный вызов: falseURL: https://****.blob.core.windows.net:443/myContainer/myConsumerGroupName/0? Comp= аренда и таймаут =10

Я не уловил это... Если у кого-то есть идея, это очень приветствуется...

Любая помощь будет оценена.

1 ответ

Решение

Я добавил таймер перед вызовом await context.CheckpointAsync();

Я думаю, что в зависимости от количества событий, если await context.CheckpointAsync(); вызывается много раз за короткое время, это не работает...

И конечно, я развернул, когда события минимальны..