Skip to content

Commit 262cb74

Browse files
committed
feat: 添加 Backoff 类及其测试,支持多种退避策略
1 parent 0fe5d1d commit 262cb74

File tree

1 file changed

+135
-0
lines changed

1 file changed

+135
-0
lines changed

types/Support/Backoff.php

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* This file is part of friendsofhyperf/components.
6+
*
7+
* @link https://github.com/friendsofhyperf/components
8+
* @document https://github.com/friendsofhyperf/components/blob/main/README.md
9+
* @contact [email protected]
10+
*/
11+
use FriendsOfHyperf\Support\Backoff\ArrayBackoff;
12+
use FriendsOfHyperf\Support\Backoff\BackoffInterface;
13+
use FriendsOfHyperf\Support\Backoff\DecorrelatedJitterBackoff;
14+
use FriendsOfHyperf\Support\Backoff\ExponentialBackoff;
15+
use FriendsOfHyperf\Support\Backoff\FibonacciBackoff;
16+
use FriendsOfHyperf\Support\Backoff\FixedBackoff;
17+
use FriendsOfHyperf\Support\Backoff\LinearBackoff;
18+
use FriendsOfHyperf\Support\Backoff\PoissonBackoff;
19+
20+
use function PHPStan\Testing\assertType;
21+
22+
// ArrayBackoff tests
23+
$arrayBackoff = new ArrayBackoff([100, 200, 300]);
24+
assertType(ArrayBackoff::class, $arrayBackoff);
25+
assertType('int', $arrayBackoff->next());
26+
assertType('int', $arrayBackoff->getAttempt());
27+
assertType('int', $arrayBackoff->sleep());
28+
$arrayBackoff->reset();
29+
assertType('array<int>', $arrayBackoff->getDelays());
30+
assertType('bool', $arrayBackoff->isUsingLastValue());
31+
32+
// ArrayBackoff static constructors
33+
assertType(ArrayBackoff::class, ArrayBackoff::fromString('100,200,300'));
34+
assertType(ArrayBackoff::class, ArrayBackoff::fromPattern('short'));
35+
assertType(ArrayBackoff::class, ArrayBackoff::fromPattern('medium'));
36+
assertType(ArrayBackoff::class, ArrayBackoff::fromPattern('long'));
37+
assertType(ArrayBackoff::class, ArrayBackoff::fromPattern('exponential'));
38+
39+
// ExponentialBackoff tests
40+
$exponentialBackoff = new ExponentialBackoff();
41+
assertType(ExponentialBackoff::class, $exponentialBackoff);
42+
assertType('int', $exponentialBackoff->next());
43+
assertType('int', $exponentialBackoff->getAttempt());
44+
assertType('int', $exponentialBackoff->sleep());
45+
$exponentialBackoff->reset();
46+
47+
$exponentialBackoffCustom = new ExponentialBackoff(100, 10000, 2.0, true);
48+
assertType(ExponentialBackoff::class, $exponentialBackoffCustom);
49+
assertType('int', $exponentialBackoffCustom->next());
50+
51+
// LinearBackoff tests
52+
$linearBackoff = new LinearBackoff();
53+
assertType(LinearBackoff::class, $linearBackoff);
54+
assertType('int', $linearBackoff->next());
55+
assertType('int', $linearBackoff->getAttempt());
56+
assertType('int', $linearBackoff->sleep());
57+
$linearBackoff->reset();
58+
59+
$linearBackoffCustom = new LinearBackoff(100, 50, 2000);
60+
assertType(LinearBackoff::class, $linearBackoffCustom);
61+
assertType('int', $linearBackoffCustom->next());
62+
63+
// FixedBackoff tests
64+
$fixedBackoff = new FixedBackoff();
65+
assertType(FixedBackoff::class, $fixedBackoff);
66+
assertType('int', $fixedBackoff->next());
67+
assertType('int', $fixedBackoff->getAttempt());
68+
assertType('int', $fixedBackoff->sleep());
69+
$fixedBackoff->reset();
70+
71+
$fixedBackoffCustom = new FixedBackoff(500);
72+
assertType(FixedBackoff::class, $fixedBackoffCustom);
73+
assertType('int', $fixedBackoffCustom->next());
74+
75+
// FibonacciBackoff tests
76+
$fibonacciBackoff = new FibonacciBackoff();
77+
assertType(FibonacciBackoff::class, $fibonacciBackoff);
78+
assertType('int', $fibonacciBackoff->next());
79+
assertType('int', $fibonacciBackoff->getAttempt());
80+
assertType('int', $fibonacciBackoff->sleep());
81+
$fibonacciBackoff->reset();
82+
83+
$fibonacciBackoffCustom = new FibonacciBackoff(10000);
84+
assertType(FibonacciBackoff::class, $fibonacciBackoffCustom);
85+
assertType('int', $fibonacciBackoffCustom->next());
86+
87+
// DecorrelatedJitterBackoff tests
88+
$decorrelatedJitterBackoff = new DecorrelatedJitterBackoff();
89+
assertType(DecorrelatedJitterBackoff::class, $decorrelatedJitterBackoff);
90+
assertType('int', $decorrelatedJitterBackoff->next());
91+
assertType('int', $decorrelatedJitterBackoff->getAttempt());
92+
assertType('int', $decorrelatedJitterBackoff->sleep());
93+
$decorrelatedJitterBackoff->reset();
94+
95+
$decorrelatedJitterBackoffCustom = new DecorrelatedJitterBackoff(100, 10000, 3.0);
96+
assertType(DecorrelatedJitterBackoff::class, $decorrelatedJitterBackoffCustom);
97+
assertType('int', $decorrelatedJitterBackoffCustom->next());
98+
99+
// PoissonBackoff tests
100+
$poissonBackoff = new PoissonBackoff();
101+
assertType(PoissonBackoff::class, $poissonBackoff);
102+
assertType('int', $poissonBackoff->next());
103+
assertType('int', $poissonBackoff->getAttempt());
104+
assertType('int', $poissonBackoff->sleep());
105+
$poissonBackoff->reset();
106+
107+
$poissonBackoffCustom = new PoissonBackoff(100, 5000);
108+
assertType(PoissonBackoff::class, $poissonBackoffCustom);
109+
assertType('int', $poissonBackoffCustom->next());
110+
111+
// BackoffInterface tests - verify all implementations are compatible
112+
assertType('FriendsOfHyperf\Support\Backoff\ArrayBackoff', $arrayBackoff);
113+
assertType('FriendsOfHyperf\Support\Backoff\ExponentialBackoff', $exponentialBackoff);
114+
assertType('FriendsOfHyperf\Support\Backoff\LinearBackoff', $linearBackoff);
115+
assertType('FriendsOfHyperf\Support\Backoff\FixedBackoff', $fixedBackoff);
116+
assertType('FriendsOfHyperf\Support\Backoff\FibonacciBackoff', $fibonacciBackoff);
117+
assertType('FriendsOfHyperf\Support\Backoff\DecorrelatedJitterBackoff', $decorrelatedJitterBackoff);
118+
assertType('FriendsOfHyperf\Support\Backoff\PoissonBackoff', $poissonBackoff);
119+
120+
// Test polymorphic usage
121+
function useBackoff(BackoffInterface $backoff): void
122+
{
123+
assertType('int', $backoff->next());
124+
assertType('int', $backoff->sleep());
125+
assertType('int', $backoff->getAttempt());
126+
$backoff->reset();
127+
}
128+
129+
useBackoff($arrayBackoff);
130+
useBackoff($exponentialBackoff);
131+
useBackoff($linearBackoff);
132+
useBackoff($fixedBackoff);
133+
useBackoff($fibonacciBackoff);
134+
useBackoff($decorrelatedJitterBackoff);
135+
useBackoff($poissonBackoff);

0 commit comments

Comments
 (0)