Darabonba/RetryPolicy/BackoffPolicy.cs (80 lines of code) (raw):

using System; using System.Collections.Generic; using Darabonba.Exceptions; namespace Darabonba.RetryPolicy { public interface IBackoffPolicy { long? GetDelayTime(RetryPolicyContext ctx); } public abstract class BackoffPolicy : IBackoffPolicy { protected string Policy { get; set; } public BackoffPolicy(string policy) { Policy = policy; } public abstract long? GetDelayTime(RetryPolicyContext ctx); public static BackoffPolicy NewBackOffPolicy(Dictionary<string, object> option) { var validPolicy = new List<string> { "Fixed", "Random", "Exponential", "EqualJitter", "ExponentialWithEqualJitter", "FullJitter", "ExponentialWithFullJitter" }; if (!option.ContainsKey("policy") || option["policy"] == null || !(option["policy"] is string)) { throw new DaraException { Message = "Invalid backoff policy" }; } else { string policy = (string)option["policy"]; if (!validPolicy.Contains(policy)) { throw new DaraException { Message = "Invalid backoff policy" }; } if (!option.ContainsKey("period") || option["period"] == null || !(option["period"] is int)) { throw new DaraException { Message = "Period must be specified." }; } int period = (int)option["period"]; switch (policy) { case "Fixed": { return new FixedBackoffPolicy(period); } case "Random": { var cap = option.ContainsKey("cap") && option["cap"] != null && option["cap"] is long ? (long)option["cap"] : 20000; return new RandomBackoffPolicy(period, cap); } case "Exponential": { var cap = option.ContainsKey("cap") && option["cap"] != null && option["cap"] is long ? (long)option["cap"] : 3L * 24 * 60 * 60 * 1000; return new ExponentialBackoffPolicy(period, cap); } case "EqualJitter": case "ExponentialWithEqualJitter": { var cap = option.ContainsKey("cap") && option["cap"] != null && option["cap"] is long ? (long)option["cap"] : 3L * 24 * 60 * 60 * 1000; return new EqualJitterBackoffPolicy(period, cap); } case "FullJitter": case "ExponentialWithFullJitter": { var cap = option.ContainsKey("cap") && option["cap"] != null && option["cap"] is long ? (long)option["cap"] : 3L * 24 * 60 * 60 * 1000; return new FullJitterBackoffPolicy(period, cap); } default: throw new DaraException { Message = "Invalid backoff policy" }; } } } } }