Проблема
Я использую Microsoft.Azure.EventHubs.Processor
для использования EventHubs с 32 параллельными разделами на 4 хостах, работающих в разных экземплярах службы.
Пока все 4 службы работают и бегая они начинают воровать перегородки снова и снова. Это заканчивается событиями, которые обрабатываются снова и снова.
Настройка
Мой 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
Спасибо, вот ответ на ваши вопросы:
На самом деле я вижу ошибки кода 409 и 412. Спасибо за указание.
(см. 1)
Это должно быть хорошо. Это постоянно контролируется.
Я не понимаю этого. В этой же группе есть и другие потребители. Эти должны разделить разделы. Но у них разные HostName
уникальные имена.
О, хорошо, я не знаю. Учетная запись хранения используется несколькими различными концентраторами EventHub и Consumer (все с разными именами. Можете ли вы дать более подробную информацию о том, зачем нужна одна учетная запись хранения?
я отключу.