Для этого есть две причины:
У вас есть два приложения, использующие одну и ту же группу потребителей для доступа к концентратору событий.Либо переделайте вашу архитектуру, чтобы иметь одно клиентское приложение, либо используйте новую группу потребителей для каждого клиента.Если вы пытаетесь распараллелить обработку, извлеките пакет событий из концентратора, а затем обработайте их параллельно, не используйте несколько считывателей в одной группе потребителей.
ИЛИ
Концентраторы событий внутренне перемещают разделы от одного хоста к другому за кулисами.В этом случае используйте просто повтор в вашем коде, и это должно работать.Для этого я использую Полли .На самом деле, на практике обычно хорошей идеей является повторение кода, называющего «облако».
Пример политики повторных попыток может быть следующим (необходимо включить пакет Polly Nuget ):
namespace RetryPolicies
{
using Microsoft.Extensions.Logging;
using Polly;
using Polly.Retry;
using System;
public class ExponentialRetryManager
{
private static readonly int MAX_RETRIES = 6;
private RetryPolicy _retryPolicy;
/// <summary>
/// An exponential retry manager that will wait as follows between retries:
///
// 2 ^ 1 = 2 seconds first, then
// 2 ^ 2 = 4 seconds then
// 2 ^ 3 = 8 seconds then
// 2 ^ 4 = 16 seconds then
// 2 ^ 5 = 32 seconds
// 2 ^ 6 = 64 seconds
/// </summary>
public ExponentialRetryManager(ILogger logger, String exceptionName = null)
{
_retryPolicy = Policy
.Handle<Exception>()
.WaitAndRetry(MAX_RETRIES, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(1, retryAttempt)),
(ex, timeSpan, retryAttempt, context) =>
{
logger.LogWarning($"Warning! [RetryAttempt={retryAttempt.ToString()}],[Ex={ex.ToString()}]");
});
}
/// <summary>
/// Executes the passed in action using the retry policy in order to
/// keep attempting to process until the MAX_RETRIES are reached.
/// </summary>
/// <param name="action"></param>
public void Retry(Action action)
{
_retryPolicy.Execute(() => action());
}
}
}
, и вы вызываете его следующим образом:
var retryManager = new ExponentialRetryManager(log);
retryManager.Retry(() => YourMethodToProcessEventHub());