Bedrock.JobQueue.QueueLease (bedrock_job_queue v0.2.0)

View Source

A lease on a queue for exclusive dequeuing.

Per QuiCK paper: Two-tier leasing prevents thundering herd by first acquiring a queue lease, then item leases within that queue. Only one consumer can hold a queue lease at a time.

Default Duration

Queue leases default to 5 seconds (vs 30 seconds for item leases). This is intentionally short because queue leases only protect the dequeue operation, not job execution. A consumer holds the queue lease just long enough to:

  1. Peek for visible items
  2. Obtain item leases on those items
  3. Release the queue lease

Item leases are held much longer to cover actual job execution time.

Summary

Functions

Derives a deterministic queue lease ID from inputs.

Returns true if the queue lease has expired.

Creates a new queue lease.

Returns the remaining time on the lease in milliseconds.

Types

t()

@type t() :: %Bedrock.JobQueue.QueueLease{
  expires_at: non_neg_integer(),
  holder: binary(),
  id: binary(),
  obtained_at: non_neg_integer(),
  queue_id: String.t()
}

Functions

derive_id(queue_id, holder, now)

@spec derive_id(String.t(), binary(), non_neg_integer()) :: binary()

Derives a deterministic queue lease ID from inputs.

This makes queue lease IDs predictable for testing while still being unique per queue/holder/time combination.

expired?(lease, opts \\ [])

@spec expired?(
  t(),
  keyword()
) :: boolean()

Returns true if the queue lease has expired.

Options

  • :now - Current time in milliseconds (default: System.system_time(:millisecond))

new(queue_id, holder, opts \\ [])

@spec new(String.t(), binary(), keyword()) :: t()

Creates a new queue lease.

Options

  • :duration_ms - Lease duration in milliseconds (default: 5_000)
  • :now - Current time in milliseconds (default: System.system_time(:millisecond))

remaining_ms(lease, opts \\ [])

@spec remaining_ms(
  t(),
  keyword()
) :: non_neg_integer()

Returns the remaining time on the lease in milliseconds.

Options

  • :now - Current time in milliseconds (default: System.system_time(:millisecond))