Class: Stoplight::Wiring::Redis::Backend Private

Inherits:
DataStoreBackend show all
Defined in:
lib/stoplight/wiring/redis/backend.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Redis storage backend with automatic failover to in-memory storage.

Every storage component is wrapped in a FailSafe decorator that catches Redis connection errors and falls back to a Memory backend. This ensures circuit breakers remain functional even when Redis is unavailable.

The failover behavior is coordinated through a dedicated circuit breaker (‘failover_light`) that prevents repeated Redis connection attempts during an outage.

Examples:

backend = Redis::Backend.new(
  redis: redis_connection,
  scripting: Scripting.new(redis:),
  key_space: KeySpace.build(system_name: "payments", light_name: "stripe"),
  config: light_config,
  error_notifier: ->(e) { Logger.error(e) },
  failover_light: Stoplight("redis-failover"),
  clock: SystemClock.new
)

backend.state_store #=> FailSafe::State wrapping Redis::State

Instance Method Summary collapse

Constructor Details

#initialize(redis:, scripting:, key_space:, config:, error_notifier:, failover_light:, clock:) ⇒ Backend

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Backend.



31
32
33
34
35
36
37
38
39
40
# File 'lib/stoplight/wiring/redis/backend.rb', line 31

def initialize(redis:, scripting:, key_space:, config:, error_notifier:, failover_light:, clock:)
  @redis = redis
  @scripting = scripting
  @key_space = key_space
  @clock = clock
  @config = config
  @error_notifier = error_notifier
  @failover_light = failover_light
  @memory_fallback = Memory::Backend.new(clock:, config:)
end

Instance Method Details

#recovery_lock_storeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/stoplight/wiring/redis/backend.rb', line 57

def recovery_lock_store
  @recovery_lock_store ||= Infrastructure::FailSafe::Storage::RecoveryLock.new(
    primary_store: Infrastructure::Redis::Storage::RecoveryLock.new(
      config: @config, # TODO: pass cool_off_time directly
      redis: @redis,
      scripting: @scripting,
      key_space: @key_space
    ),
    error_notifier: @error_notifier,
    failover_store: @memory_fallback.recovery_lock_store,
    circuit_breaker: @failover_light
  )
end

#recovery_metrics_storeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/stoplight/wiring/redis/backend.rb', line 71

def recovery_metrics_store
  @recovery_metrics_store ||= Infrastructure::FailSafe::Storage::Metrics.new(
    error_notifier: @error_notifier,
    primary_store: Infrastructure::Redis::Storage::RecoveryMetrics.new(
      clock: @clock,
      redis: @redis,
      scripting: @scripting,
      key_space: @key_space
    ),
    failover_store: @memory_fallback.recovery_metrics_store,
    circuit_breaker: @failover_light
  )
end

#state_storeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/stoplight/wiring/redis/backend.rb', line 42

def state_store
  @state_store ||= Infrastructure::FailSafe::Storage::State.new(
    primary_store: Infrastructure::Redis::Storage::State.new(
      redis: @redis,
      scripting: @scripting,
      key_space: @key_space,
      cool_off_time: @config.cool_off_time,
      clock: @clock
    ),
    error_notifier: @error_notifier,
    failover_store: @memory_fallback.state_store,
    circuit_breaker: @failover_light
  )
end

#unbounded_metrics_storeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/stoplight/wiring/redis/backend.rb', line 100

def unbounded_metrics_store
  @unbounded_metrics_store ||= Infrastructure::FailSafe::Storage::Metrics.new(
    error_notifier: @error_notifier,
    primary_store: Infrastructure::Redis::Storage::UnboundedMetrics.new(
      clock: @clock,
      redis: @redis,
      scripting: @scripting,
      key_space: @key_space
    ),
    failover_store: @memory_fallback.unbounded_metrics_store,
    circuit_breaker: @failover_light
  )
end

#windowed_metrics_storeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/stoplight/wiring/redis/backend.rb', line 85

def windowed_metrics_store
  @windowed_metrics_store ||= Infrastructure::FailSafe::Storage::Metrics.new(
    error_notifier: @error_notifier,
    primary_store: Infrastructure::Redis::Storage::WindowMetrics.new(
      config: @config, # TODO: pass window size directly
      redis: @redis,
      scripting: @scripting,
      clock: @clock,
      key_space: @key_space
    ),
    failover_store: @memory_fallback.windowed_metrics_store,
    circuit_breaker: @failover_light
  )
end