GlobalSemaphore

CI

Cluster-wide semaphore with a dead-simple API.

# config :global_semaphore, :limits, pdf_api: 3
GlobalSemaphore.with_permit(:pdf_api, fn ->
generate_pdf() # max 3 concurrent calls across the entire cluster
end)
# With priority (lower number = higher priority, default 5)
GlobalSemaphore.with_permit({:pdf_api, 1}, fn ->
generate_pdf() # high priority, preempts normal/low requests in the queue
end)

Why?

Installation

def deps do
[{:global_semaphore, "~> 0.3.0"}]
end

Usage

# config/runtime.exs
config :global_semaphore, :limits,
pdf_api: 3,
email_api: 5
# Recommended: automatic acquire/release
GlobalSemaphore.with_permit(:pdf_api, fn ->
call_pdf_api()
end)
# With priority (lower number = higher priority, default 5)
GlobalSemaphore.with_permit({:pdf_api, 1}, fn -> call_pdf_api() end) # high
GlobalSemaphore.with_permit({:pdf_api, 5}, fn -> call_pdf_api() end) # normal (default)
GlobalSemaphore.with_permit({:pdf_api, 10}, fn -> call_pdf_api() end) # low

Limitations

License

MIT