Skip to content

Commit 4972615

Browse files
Add jitter to renewal time calculation (Azure#49079)
1 parent fa4c84f commit 4972615

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

sdk/servicebus/Azure.Messaging.ServiceBus/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
### Other Changes
1212

13+
- Added jitter to the lock renewal timer to reduce the likelihood of lock renewal collisions when using the `ServiceBusProcessor` or the `ServiceBusSessionProcessor`.
14+
1315
## 7.18.4 (2025-02-11)
1416

1517
### Bugs Fixed

sdk/servicebus/Azure.Messaging.ServiceBus/src/Processor/ReceiverManager.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ internal class ReceiverManager
2929
protected readonly ServiceBusProcessorOptions ProcessorOptions;
3030
private readonly MessagingClientDiagnostics _clientDiagnostics;
3131

32+
private static int s_randomSeed = Environment.TickCount;
33+
private static readonly ThreadLocal<Random> RandomNumberGenerator = new ThreadLocal<Random>(() => new Random(Interlocked.Increment(ref s_randomSeed)), false);
34+
3235
protected bool AutoRenewLock => ProcessorOptions.MaxAutoLockRenewalDuration > TimeSpan.Zero ||
3336
ProcessorOptions.MaxAutoLockRenewalDuration == Timeout.InfiniteTimeSpan;
3437

@@ -397,17 +400,15 @@ protected virtual async Task RaiseExceptionReceived(ProcessErrorEventArgs eventA
397400

398401
protected static TimeSpan CalculateRenewDelay(DateTimeOffset lockedUntil)
399402
{
400-
var remainingTime = lockedUntil - DateTimeOffset.UtcNow;
403+
var shortJitter = TimeSpan.FromMilliseconds(RandomNumberGenerator.Value.Next(0, 50));
404+
var longJitter = TimeSpan.FromMilliseconds(RandomNumberGenerator.Value.Next(0, 200));
401405

402-
if (remainingTime < TimeSpan.FromMilliseconds(400))
403-
{
404-
return TimeSpan.Zero;
405-
}
406+
var remainingTime = lockedUntil - DateTimeOffset.UtcNow;
406407

407408
var buffer = TimeSpan.FromTicks(Math.Min(remainingTime.Ticks / 2, Constants.MaximumRenewBufferDuration.Ticks));
408-
var renewAfter = remainingTime - buffer;
409+
var renewAfter = remainingTime - buffer - longJitter;
409410

410-
return renewAfter;
411+
return renewAfter < TimeSpan.FromMilliseconds(400) ? shortJitter : renewAfter;
411412
}
412413
}
413414
}

0 commit comments

Comments
 (0)