diff --git a/docs/strategies/circuit-breaker.md b/docs/strategies/circuit-breaker.md index de231900791..50ff7a5b7e6 100644 --- a/docs/strategies/circuit-breaker.md +++ b/docs/strategies/circuit-breaker.md @@ -185,7 +185,7 @@ sequenceDiagram C->>P: Calls ExecuteAsync P->>CB: Calls ExecuteCore - CB->>CB: Rejects request + CB-->>CB: Rejects request CB->>P: Throws
BrokenCircuitException P->>C: Propagates exception deactivate CB @@ -203,6 +203,8 @@ Let's suppose we have a circuit breaker strategy with the following configuratio #### Complex: happy path sequence diagram +The circuit will break and later it will transition into the `HalfOpen` state. The probe will then succeed, so the circuit breaker will go back to the normal (`Closed`) state. + ```mermaid sequenceDiagram autonumber @@ -230,7 +232,7 @@ sequenceDiagram C->>P: Calls ExecuteAsync P->>CB: Calls ExecuteCore - CB->>CB: Rejects request + CB-->>CB: Rejects request CB->>P: Throws
BrokenCircuitException P->>C: Propagates exception @@ -247,6 +249,8 @@ sequenceDiagram #### Complex: unhappy path sequence diagram +The circuit will break and later it will transition into the `HalfOpen` state. The probe will then fail, so the circuit breaker will become broken again (the `Open` state). + ```mermaid sequenceDiagram autonumber @@ -274,7 +278,7 @@ sequenceDiagram C->>P: Calls ExecuteAsync P->>CB: Calls ExecuteCore - CB->>CB: Rejects request + CB-->>CB: Rejects request CB->>P: Throws
BrokenCircuitException P->>C: Propagates exception diff --git a/docs/strategies/fallback.md b/docs/strategies/fallback.md index 81057a9b71e..a501bba6769 100644 --- a/docs/strategies/fallback.md +++ b/docs/strategies/fallback.md @@ -91,13 +91,16 @@ sequenceDiagram actor C as Caller participant P as Pipeline participant F as Fallback + participant FA as FallbackAction participant D as DecoratedUserCallback C->>P: Calls ExecuteAsync P->>F: Calls ExecuteCore F->>+D: Invokes D->>-F: Fails - F->>F: Falls back to
substitute result + F->>+FA: Invokes + FA-->>FA: Calculates substitute result + FA->>-F: Returns
substituted result F->>P: Returns
substituted result P->>C: Returns
substituted result ``` diff --git a/docs/strategies/hedging.md b/docs/strategies/hedging.md index 132ed78137f..be75d915802 100644 --- a/docs/strategies/hedging.md +++ b/docs/strategies/hedging.md @@ -265,7 +265,7 @@ sequenceDiagram #### Parallel: unhappy path sequence diagram -The hedging strategy triggers because the `Delay` is set to zero. It succeeds because one of the requests succeeds. +The hedging strategy triggers because the `Delay` is set to zero. It fails because all requests fail. ```mermaid sequenceDiagram @@ -321,9 +321,8 @@ new ResiliencePipelineBuilder() { var delay = args.AttemptNumber switch { - 0 => TimeSpan.FromSeconds(1), - 1 => TimeSpan.FromSeconds(2), - _ => System.Threading.Timeout.InfiniteTimeSpan + 0 or 1 => TimeSpan.Zero, // Parallel mode + _ => TimeSpan.FromSeconds(-1) // switch to Fallback mode }; return new ValueTask(delay); @@ -339,7 +338,7 @@ With this configuration, the hedging strategy: #### Dynamic: happy path sequence diagram -The hedging strategy triggers and switches between modes due to the usage of `DelayGenerator`. It succeeds because the last request succeeds. +The hedging strategy triggers and switches between modes due to our `DelayGenerator`. It succeeds because the last request succeeds. ```mermaid sequenceDiagram @@ -356,12 +355,12 @@ sequenceDiagram Note over H: Parallel mode par H->>DG: Gets delay - DG->>H: 1 second + DG->>H: 0 second H->>HUC: Invokes (R1) activate HUC and H ->> DG: Gets delay - DG ->> H: 2 seconds + DG ->> H: 0 second H->>+HUC: Invokes (R2) end @@ -373,13 +372,13 @@ sequenceDiagram Note over H: Fallback mode H->>DG: Gets delay - DG->>H: Infinite + DG->>H: -1 second H->>+HUC: Invokes (R3) HUC-->>HUC: Processes R3 HUC->>-H: Fails (R3) H->>DG: Gets delay - DG->>H: Infinite + DG->>H: -1 second H->>+HUC: Invokes (R4) HUC-->>HUC: Processes R4 HUC->>-H: Returns result (R4) @@ -391,7 +390,7 @@ sequenceDiagram #### Dynamic: unhappy path sequence diagram -The hedging strategy triggers and switches between modes due to the usage of `DelayGenerator`. It fails because all requests fail. +The hedging strategy triggers and switches between modes due our `DelayGenerator`. It fails because all requests fail. ```mermaid sequenceDiagram @@ -408,12 +407,12 @@ sequenceDiagram Note over H: Parallel mode par H->>DG: Gets delay - DG->>H: 1 second + DG->>H: 0 second H->>HUC: Invokes (R1) activate HUC and H->>DG: Gets delay - DG->>H: 2 seconds + DG->>H: 0 second H->>+HUC: Invokes (R2) end @@ -425,13 +424,13 @@ sequenceDiagram Note over H: Fallback mode H->>DG: Gets delay - DG->>H: Infinite + DG->>H: -1 second H->>+HUC: Invokes (R3) HUC-->>HUC: Processes R3 HUC->>-H: Fails (R3) H -> DG: Gets delay - DG->>H: Infinite + DG->>H: -1 second H->>+HUC: Invokes (R4) HUC-->>HUC: Processes R4 HUC->>-H: Fails (R4) @@ -486,6 +485,43 @@ new ResiliencePipelineBuilder() ``` +### Action generator: sequence diagram + +```mermaid +sequenceDiagram + autonumber + actor C as Caller + participant P as Pipeline + participant H as Hedging + participant AG as ActionGenerator + participant UC as UserCallback + participant HUC as HedgedUserCallback + + C->>P: Calls ExecuteAsync + P->>H: Calls ExecuteCore + + activate H + H->>+UC: Invokes (R1) + UC-->>UC: Processes R1 + UC->>-H: Fails (R1) + H->>+AG: Invokes + AG->>-H: Returns factory + H-->>H: Invokes factory + + H->>+HUC: Invokes (R2) + HUC-->>HUC: Processes R2 + HUC->>-H: Fails (R2) + + H-->>H: Invokes factory + H->>+HUC: Invokes (R3) + HUC-->>HUC: Processes R3 + HUC->>-H: Returns result (R3) + deactivate H + + H->>P: Returns result (R3) + P->>C: Returns result (R3) +``` + ### Parameterized callbacks and action generator When you have control over the callbacks that the resilience pipeline receives, you can parameterize them. This flexibility allows for reusing the callbacks within an action generator. diff --git a/docs/strategies/rate-limiter.md b/docs/strategies/rate-limiter.md index 8aaa0f8d5fc..9fc87a86f25 100644 --- a/docs/strategies/rate-limiter.md +++ b/docs/strategies/rate-limiter.md @@ -84,6 +84,7 @@ Let's suppose we have a rate limiter strategy with `PermitLimit` : `1` and `Wind ```mermaid sequenceDiagram + autonumber actor C as Caller participant P as Pipeline participant RL as RateLimiter @@ -112,6 +113,7 @@ sequenceDiagram ```mermaid sequenceDiagram + autonumber actor C as Caller participant P as Pipeline participant RL as RateLimiter @@ -127,7 +129,7 @@ sequenceDiagram Note over C: Few seconds later... C->>P: Calls ExecuteAsync P->>RL: Calls ExecuteCore - RL->>RL: Rejects request + RL-->>RL: Rejects request RL->>P: Throws
RateLimiterRejectedException P->>C: Propagates exception Note over RL,D: Window end @@ -156,7 +158,7 @@ sequenceDiagram P->>CL: Calls ExecuteCore CL->>+D: Invokes (C1) P->>CL: Calls ExecuteCore - CL->>CL: Queues request + CL-->>CL: Queues request D->>-CL: Returns result (C1) CL->>P: Returns result (C1) @@ -189,9 +191,9 @@ sequenceDiagram P->>CL: Calls ExecuteCore CL->>+D: Invokes (C1) P->>CL: Calls ExecuteCore - CL->>CL: Queues request (C2) + CL-->>CL: Queues request (C2) P->>CL: Calls ExecuteCore - CL->>CL: Rejects request (C3) + CL-->>CL: Rejects request (C3) CL->>P: Throws
RateLimiterRejectedException P->>C3: Propagates exception diff --git a/docs/strategies/retry.md b/docs/strategies/retry.md index 9fe0bbd0553..3b62c4ba275 100644 --- a/docs/strategies/retry.md +++ b/docs/strategies/retry.md @@ -122,7 +122,7 @@ sequenceDiagram Note over R,D: Initial attempt R->>+D: Invokes D->>-R: Fails - R->>R: Sleeps + R-->>R: Sleeps Note over R,D: 1st retry attempt R->>+D: Invokes D->>-R: Returns result @@ -144,11 +144,11 @@ sequenceDiagram Note over R,D: Initial attempt R->>+D: Invokes D->>-R: Fails - R->>R: Sleeps + R-->>R: Sleeps Note over R,D: 1st retry attempt R->>+D: Invokes D->>-R: Fails - R->>R: Sleeps + R-->>R: Sleeps Note over R,D: 2nd retry attempt R->>+D: Invokes D->>-R: Fails diff --git a/docs/strategies/timeout.md b/docs/strategies/timeout.md index d0d65c7c710..38b5110211b 100644 --- a/docs/strategies/timeout.md +++ b/docs/strategies/timeout.md @@ -92,7 +92,7 @@ sequenceDiagram C->>P: Calls ExecuteAsync P->>T: Calls ExecuteCore T->>+D: Invokes - D->>D: Performs
long-running
operation + D-->>D: Performs
long-running
operation D->>-T: Returns result T->>P: Returns result P->>C: Returns result @@ -112,8 +112,8 @@ sequenceDiagram T->>+D: Invokes activate T activate D - D->>D: Performs
long-running
operation - T->T: Times out + D-->>D: Performs
long-running
operation + T-->>T: Times out deactivate T T->>D: Propagates cancellation deactivate D diff --git a/src/Snippets/Docs/Hedging.cs b/src/Snippets/Docs/Hedging.cs index 051efe543cc..649a3243515 100644 --- a/src/Snippets/Docs/Hedging.cs +++ b/src/Snippets/Docs/Hedging.cs @@ -64,9 +64,8 @@ public static void DynamicMode() { var delay = args.AttemptNumber switch { - 0 => TimeSpan.FromSeconds(1), - 1 => TimeSpan.FromSeconds(2), - _ => System.Threading.Timeout.InfiniteTimeSpan + 0 or 1 => TimeSpan.Zero, // Parallel mode + _ => TimeSpan.FromSeconds(-1) // switch to Fallback mode }; return new ValueTask(delay);