Skip to content

Commit 1d76808

Browse files
committed
feature #53328 [Messenger] Add jitter parameter to MultiplierRetryStrategy (rmikalkenas)
This PR was merged into the 7.1 branch. Discussion ---------- [Messenger] Add jitter parameter to MultiplierRetryStrategy | Q | A | ------------- | --- | Branch? | 7.1 | Bug fix? | no | New feature? | yes | Deprecations? | no | Issues | - | License | MIT I'm seeing an interesting case, when multiple queue consumers causes failures in a downstream systems a.k.a. [thundering herd](https://en.wikipedia.org/wiki/Thundering_herd_problem) effect. Many jobs fail, they all get enqueued to try again in a static interval and bring down the downstream system yet again. This repeats until the retry limit is exhausted. Introduced delay randomness prevents thundering herd effect. The randomness can be controlled via `$jitter` parameter. ~~**Open question:** I added `$jitter` parameter with a default value of `0.1` (as in [http client's generic retry](https://github.com/symfony/symfony/blob/7.1/src/Symfony/Component/HttpClient/Retry/GenericRetryStrategy.php)), but maybe it should be set as `0` to keep code in a BC fashion?~~ Commits ------- 99496840e7 [Messenger] Add jitter parameter to MultiplierRetryStrategy
2 parents a1db5df + d4819b6 commit 1d76808

File tree

3 files changed

+4
-1
lines changed

3 files changed

+4
-1
lines changed

DependencyInjection/Configuration.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1592,6 +1592,7 @@ function ($a) {
15921592
->integerNode('delay')->defaultValue(1000)->min(0)->info('Time in ms to delay (or the initial value when multiplier is used)')->end()
15931593
->floatNode('multiplier')->defaultValue(2)->min(1)->info('If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries))')->end()
15941594
->integerNode('max_delay')->defaultValue(0)->min(0)->info('Max time in ms that a retry should ever be delayed (0 = infinite)')->end()
1595+
->floatNode('jitter')->defaultValue(0.1)->min(0)->max(1)->info('Randomness to apply to the delay (between 0 and 1)')->end()
15951596
->end()
15961597
->end()
15971598
->scalarNode('rate_limiter')

DependencyInjection/FrameworkExtension.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2195,7 +2195,8 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
21952195
->replaceArgument(0, $transport['retry_strategy']['max_retries'])
21962196
->replaceArgument(1, $transport['retry_strategy']['delay'])
21972197
->replaceArgument(2, $transport['retry_strategy']['multiplier'])
2198-
->replaceArgument(3, $transport['retry_strategy']['max_delay']);
2198+
->replaceArgument(3, $transport['retry_strategy']['max_delay'])
2199+
->replaceArgument(4, $transport['retry_strategy']['jitter']);
21992200
$container->setDefinition($retryServiceId, $retryDefinition);
22002201

22012202
$transportRetryReferences[$name] = new Reference($retryServiceId);

Resources/config/messenger.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@
160160
abstract_arg('delay ms'),
161161
abstract_arg('multiplier'),
162162
abstract_arg('max delay ms'),
163+
abstract_arg('jitter'),
163164
])
164165

165166
// rate limiter

0 commit comments

Comments
 (0)