public LatencyModule(ILatencyPerformer latencyPerformer, RateManager rateManager, Func <TimeSpan> latencyProvider, Func <double> rateProvider) { this.latencyProvider = latencyProvider; this.rateProvider = rateProvider; this.latencyPerformer = latencyPerformer; this.rateManager = rateManager; }
/// <summary> /// Inject latency to the every request retry with custom <paramref name="latencyPerformer"/> /// </summary> /// <example> /// <code> /// ------► + injected latency ---► replica(1..n) /// ↑__________retry (1..n)__________________| /// </code> /// </example> /// <param name="configuration">IClusterClientConfiguration instance</param> /// <param name="latencyPerformer">Custom class for latency performing or simulation</param> /// <param name="latencyProvider">Func returning latency to inject</param> /// <param name="rateProvider">Func returning injection probability (rate)</param> public static void InjectLatencyOnEveryRetry( this IClusterClientConfiguration configuration, ILatencyPerformer latencyPerformer, Func <TimeSpan> latencyProvider, Func <double> rateProvider) { configuration.AddRequestModule(new LatencyModule(latencyPerformer, new RateManager(), latencyProvider, rateProvider), RequestModule.RequestRetry, ModulePosition.After); }
public LatencyStrategy(ILatencyPerformer latencyPerformer, RateManager rateManager, Func <TimeSpan> latencyProvider, Func <double> rateProvider, IRequestStrategy baseStrategy) { this.latencyPerformer = latencyPerformer; this.rateManager = rateManager; this.latencyProvider = latencyProvider; this.rateProvider = rateProvider; this.baseStrategy = baseStrategy; }
/// <summary> /// Inject latency to the every strategy IRequestSender.SendToReplicaAsync call with custom <paramref name="latencyPerformer"/> /// </summary> /// <example> /// <code> /// ---► + injected latency ---► replica1 ---► + injected latency ---> replica2 ... /// ◄---------------------| /// </code> /// </example> /// <param name="configuration">IClusterClientConfiguration instance</param> /// <param name="latencyPerformer">Custom class for latency performing</param> /// <param name="latencyProvider">Func returning latency to inject</param> /// <param name="rateProvider">Func returning injection probability (rate)</param> public static void InjectLatencyOnEveryNetworkCall( this IClusterClientConfiguration configuration, ILatencyPerformer latencyPerformer, Func <TimeSpan> latencyProvider, Func <double> rateProvider) { configuration.DefaultRequestStrategy = new LatencyStrategy(latencyPerformer, new RateManager(), latencyProvider, rateProvider, configuration.DefaultRequestStrategy); }
public LatencyRequestSender( IRequestSender baseRequestSender, ILatencyPerformer latencyPerformer, RateManager rateManager, TimeSpan latency, double rate) { this.baseRequestSender = baseRequestSender; this.latencyPerformer = latencyPerformer; this.rateManager = rateManager; this.latency = latency; this.rate = rate; }