Temos um listener que recebe uma mensagem de uma fila do Service Bus e depois envia o corpo para uma API.
Usamos o Polly para resiliência na nuvem, ou seja, a política DecorrelatedJitterBackoffV2.
Nossa preocupação com esta política é que não temos certeza de como calcular o tempo máximo que pode levar para concluir todas as novas tentativas, por exemplo, quando medianFirstRetryDelay
é definido como 500ms e retryCount
é definido como 3.
Isso é importante para nós devido à duração do bloqueio da mensagem na fila do Barramento de Serviço. Queremos garantir que a duração do bloqueio exceda o tempo necessário para concluir todas as novas tentativas.
Tentar novamente
Se você usar
DecorrelatedJitterBackoffV2
para gerar as durações do sono, poderá iterar o resultado, pois é umIEnumerable
Lembre-se de que os
TimeSpan
s gerados podem variar muito entre cada chamada de método.Gerei cinco vezes as sequências e tenho estas
Se você calcular a soma dos intervalos de tempo em cada sequência,
delays.Select(t => t.TotalMilliseconds).Sum()
os resultados variam entre 1,5 segundos e 2,5 segundos (geralmente).Tempo esgotado
Você pode maximizar a duração de cada operação aplicando uma política de tempo limite local nela.
Local neste contexto significa o seguinte:
TimeoutRejectedException
tambémVamos fazer as contas
Para calcular o pior cenário, você pode fazer o seguinte:
retryCount
para 3, isso significa que você tem 4 tentativas (a chamada inicial e as 3 novas tentativas)Se você definir o tempo limite para 1,5 segundos, isso significa que, na pior das hipóteses, ele terminará em 9 segundos (4x 1,5 segundos + 3 segundos de suspensão).
Claro, se você executar algum código demorado no
onTimeout
ou dentro do,onRetry
então deve adicioná-los ao seu cálculo também.