Skip to content

Latest commit

 

History

History
47 lines (39 loc) · 1.97 KB

File metadata and controls

47 lines (39 loc) · 1.97 KB

Leader Election Implementation — TODO

Completed Steps

Step 1: Create src/services/leaderElection.js

  • Implement Redis lease-based distributed lock
  • tryAcquire() — SET key value NX PX
  • renew() — Lua script for atomic check-and-renew
  • release() — Lua script for atomic conditional DEL
  • isLeader() — check if current instance holds lease
  • getCurrentLeader() — get current lease holder from Redis
  • Periodic renewal loop (start/stop)
  • Clear logging on state transitions

Step 2: Update src/config.js

  • Add INSTANCE_ID env var (default: auto-generated from hostname + random suffix)
  • Add LEASE_TTL_MS env var (default: 15000)
  • Add LEASE_RENEW_INTERVAL_MS env var (default: 5000)
  • Export leaderElection config section

Step 3: Create src/jobs/leaderAwareJob.js

  • Factory that wraps job modules
  • Only activates underlying job when leader
  • Reacts to leadership transitions (acquire/renew/release)
  • Graceful lease release on stop
  • Extended getHealth() with leadership info
  • Clear logging: "acting as follower" / "acquired leader lease"

Step 4: Update src/index.js

  • Import leader election service and leader-aware job wrapper
  • Create leader election instances for price_refresh, webhook_retry, airdrop_expiry
  • Wrap all three background jobs with leader-aware wrapper
  • Use wrapped jobs in startServer()
  • Use wrapped jobs in shutdown() (await stop for graceful lease release)
  • Update health endpoint to include leadership state per job
  • Add leader_election section to health response
  • Clean up duplicate/broken code

Step 5: Update README.md

  • Document leader-election mechanism
  • Document failover timing (TTL + renewal gap)
  • New env vars table entries
  • How to verify which replica holds the lock

Step 6: Create tests in test/leaderElection.test.js

  • Test file created with comprehensive test suite