Skip to content

Instantly share code, notes, and snippets.

@mj-hd
Created October 1, 2021 15:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mj-hd/a6587808317d3d905373c43b04f83d4e to your computer and use it in GitHub Desktop.
Save mj-hd/a6587808317d3d905373c43b04f83d4e to your computer and use it in GitHub Desktop.
backoff_stream.dart
import 'dart:math';
Stream<int> linearBackoff({
required int limit,
required num delay,
}) async* {
for (var i = 0; i < limit; i++) {
await Future.delayed(Duration(milliseconds: delay.floor()));
yield i;
}
}
Stream<int> exponentialBackoff({
required int limit,
required num base,
num capacity = double.infinity,
num factor = 2,
}) async* {
final random = Random();
for (var i = 0; i < limit; i++) {
final delay = random.nextDouble() * min(capacity, base * pow(factor, i));
await Future.delayed(Duration(milliseconds: delay.floor()));
yield i;
}
}
void main() async {
final backoff = exponentialBackoff(limit: 5, base: 100, capacity: 1000);
DateTime prev = DateTime.now();
await for (final i in backoff) {
final now = DateTime.now();
print('retry#$i ${now.difference(prev).inMilliseconds}ms');
prev = now;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment