EventHubProcessor аренды украдены между хостами снова и снова - PullRequest
1 голос
/ 08 марта 2020

Проблема

Я использую Microsoft.Azure.EventHubs.Processor для использования EventHubs с 32 параллельными разделами на 4 хостах, работающих в разных экземплярах службы.

Пока все 4 службы работают и бегая они начинают воровать перегородки снова и снова. Это заканчивается событиями, которые обрабатываются снова и снова.

event flow

Настройка

Мой IEventProcessor в настоящее время выглядит следующим образом:

public class BaseEventProcessor : IEventProcessor
{
    readonly TimeSpan DefaultCheckpointInterval = TimeSpan.FromMinutes(1);
    readonly TimeSpan _checkpointInterval;
    Stopwatch _checkpointStopWatch;

    public BaseEventProcessor(TimeSpan? checkpointInterval = null)
    {
        _checkpointInterval = checkpointInterval ?? DefaultCheckpointInterval;
    }

    public virtual Task ProcessErrorAsync(PartitionContext context, Exception error)
    {
        // some log code

        return Task.CompletedTask;
    }

    public virtual async Task CloseAsync(PartitionContext context, CloseReason reason)
    {
        // some log code

        if (reason == CloseReason.Shutdown)
        {
            await context.CheckpointAsync();
        }
    }

    public virtual Task OpenAsync(PartitionContext context)
    {
        // some log code

        _checkpointStopWatch = new Stopwatch();
        _checkpointStopWatch.Start();

        return Task.CompletedTask;
    }

    public virtual async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
    {
        // some processing code

        if (messages.Count() > 0 && _checkpointStopWatch.Elapsed >= _checkpointInterval)
        {
            await context.CheckpointAsync();
            _checkpointStopWatch.Restart();
        }
    }
}

Процессор инициализируется с этими параметрами:

new EventProcessorOptions
{                            
    PrefetchCount = 200,
    MaxBatchSize = 100,
    InitialOffsetProvider = (partitionId) => EventPosition.FromEnd(),
    InvokeProcessorAfterReceiveTimeout = true,
    ReceiveTimeout = TimeSpan.FromSeconds(30),
    EnableReceiverRuntimeMetric = true
}

И менеджер разделов с этими параметрами:

new PartitionManagerOptions
{
    RenewInterval = TimeSpan.FromSeconds(10),
    LeaseDuration = TimeSpan.FromSeconds(60)                            
}

Выход

Это ошибки брошенный внутрь ProcessError метод:

Указанный идентификатор аренды не соответствует идентификатору аренды для BLOB-объекта.

-

Приемник 'dadf82a9-d27a-4af6-b482-5158c23bebe0' с более высокой эпохой '14' уже существует. Приемник '65bc9d06-c09b-4ab5-af62-75e05ecaa88a' с эпохой 11 не может быть создан. Убедитесь, что вы создаете приемник с возрастающим значением периода, чтобы обеспечить возможность соединения, или убедитесь, что все старые приемники периода закрыты или отключены

-

Новый приемник ed4fbbcd-5896- 40d2-adc9-55feb77f6564 'с более высокой эпохой' 12 'создается, следовательно, текущий приемник' 65bc9d06-c09b-4ab5-af62-75e05ecaa88a 'с эпохой' 11 'отключается. Если вы воссоздаете приемник, убедитесь, что используется более высокая эпоха.

Вопрос

Что я здесь не так делаю? Нужно ли настраивать параметры или нужно как-то реагировать на ошибку?


Ответ на @Serkant Karaca

Спасибо, вот ответ на ваши вопросы:

  1. На самом деле я вижу ошибки кода 409 и 412. Спасибо за указание.

  2. (см. 1)

  3. Это должно быть хорошо. Это постоянно контролируется.

  4. Я не понимаю этого. В этой же группе есть и другие потребители. Эти должны разделить разделы. Но у них разные HostName уникальные имена.

  5. О, хорошо, я не знаю. Учетная запись хранения используется несколькими различными концентраторами EventHub и Consumer (все с разными именами. storage account Можете ли вы дать более подробную информацию о том, зачем нужна одна учетная запись хранения?

  6. я отключу.

1 Ответ

1 голос
/ 10 марта 2020

Пара вещей для проверки:

  1. Обязательно регистрируйте ошибки как из обработчика ошибок IProcessorHost, так и из обработчика ошибок EventProcessorOptions.

  2. Проверьте, есть ли любые исключения хранения, которые клиенты регистрируют. Это важно для определения того, произошла ли потеря аренды из-за сбоев ввода-вывода хранилища.

  3. Проверка использования ресурсов на стороне клиента, таких как ЦП, лишение потоков, доступная память и т. Д. c. Высокое использование ресурсов может задержать планирование задач и, следовательно, может привести к тайм-аутам ввода-вывода.

  4. Убедитесь, что другие получатели из той же группы потребителей не потребляют другие ресурсы. Обратите внимание, что на один раздел может быть один приемник эпохи. Каждая группа хостов должна получать от выделенной группы потребителей. Получатели могут наблюдать ReceiverDisconnectedExceptions, если 2 группы хостов начинают конкурировать за одну и ту же группу потребителей.

  5. Выделите одну учетную запись хранения для каждой группы потребителей. По сути, не делитесь учетной записью хранения с какой-либо другой службой или потребителем. Это рекомендуется из-за учета дросселирования хранилища. Если в некоторых других службах происходит высокий объем операций ввода-вывода при хранении и, следовательно, регулирование, это также может повлиять на операции аренды.

  6. Убедитесь, что мягкое удаление отключено для учетной записи хранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...