Files
KArtSell.Aegis/docs/Design/kbx-foundation-v60-status-canonical-contract-hardening/backend/Shared/Integrations/KbxPollyIntegrationPipeline.cs
T
kjh2064 3f293d8aa8
deploy / deploy (push) Successful in 1m52s
deploy / notify (push) Successful in 1s
V13-FE-006: consolidate approved UI and contract hardening
2026-08-13 02:41:00 +09:00

51 lines
2.0 KiB
C#

using Polly;
using Polly.CircuitBreaker;
using Polly.Retry;
namespace Kbx.Shared.Integrations;
// Polly is intentionally limited to short-lived transient resilience.
// Persistent retries are scheduled by Hangfire from durable integration state.
public sealed class KbxPollyIntegrationPipeline
{
public ResiliencePipeline<KbxIntegrationAttemptResult> Build(
int maxRetryAttempts,
TimeSpan baseDelay,
TimeSpan timeout,
double failureRatio,
TimeSpan samplingDuration,
int minimumThroughput,
TimeSpan breakDuration)
{
return new ResiliencePipelineBuilder<KbxIntegrationAttemptResult>()
.AddCircuitBreaker(new CircuitBreakerStrategyOptions<KbxIntegrationAttemptResult>
{
ShouldHandle = static args => args.Outcome switch
{
{ Exception: HttpRequestException } => PredicateResult.True(),
{ Result.FailureKind: KbxIntegrationFailureKind.Transient } => PredicateResult.True(),
_ => PredicateResult.False(),
},
FailureRatio = failureRatio,
SamplingDuration = samplingDuration,
MinimumThroughput = minimumThroughput,
BreakDuration = breakDuration,
})
.AddRetry(new RetryStrategyOptions<KbxIntegrationAttemptResult>
{
ShouldHandle = static args => args.Outcome switch
{
{ Exception: HttpRequestException } => PredicateResult.True(),
{ Result.FailureKind: KbxIntegrationFailureKind.Transient } => PredicateResult.True(),
_ => PredicateResult.False(),
},
MaxRetryAttempts = maxRetryAttempts,
Delay = baseDelay,
BackoffType = DelayBackoffType.Exponential,
UseJitter = true,
})
.AddTimeout(timeout)
.Build();
}
}