Class: Lepus::Producers::Middlewares::Unique
- Inherits:
-
Middleware
- Object
- Middleware
- Lepus::Producers::Middlewares::Unique
- Defined in:
- lib/lepus/producers/middlewares/unique.rb
Overview
A middleware that prevents duplicate messages from being published using the de-dupe gem for Redis-based distributed locking.
When a lock is acquired, the middleware adds x-dedupe-lock-key and x-dedupe-lock-id headers to the message so that a consumer middleware can release the lock after successful processing.
Constant Summary collapse
- HEADER_LOCK_KEY =
"x-dedupe-lock-key"- HEADER_LOCK_ID =
"x-dedupe-lock-id"- HEADER_LOCK_TTL =
"x-dedupe-lock-ttl"
Instance Method Summary collapse
- #call(message, app) ⇒ Object
-
#initialize(lock_key:, lock_id:, ttl: nil) ⇒ Unique
constructor
A new instance of Unique.
Constructor Details
#initialize(lock_key:, lock_id:, ttl: nil) ⇒ Unique
Returns a new instance of Unique.
26 27 28 29 30 31 |
# File 'lib/lepus/producers/middlewares/unique.rb', line 26 def initialize(lock_key:, lock_id:, ttl: nil) super() @lock_key = lock_key @lock_id = lock_id @ttl = ttl end |
Instance Method Details
#call(message, app) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/lepus/producers/middlewares/unique.rb', line 33 def call(, app) id = @lock_id.call() return app.call() if id.nil? lock_opts = {} lock_opts[:ttl] = @ttl if @ttl lock = DeDupe::Lock.new(lock_key: @lock_key, lock_id: id.to_s, **lock_opts) return unless lock.acquire = add_dedupe_headers(, id) app.call() end |