🐇 Elixir RabbitMQ Client
rabbit_mq is an opinionated RabbitMQ client to help you build balanced and consistent Consumers and Producers.
Table of contents
Installation and Usage
Add :rabbit_mq as a dependency to your project's mix.exs:
defp deps do
[
{:rabbit_mq, "~> 0.0.0-alpha-8"}
]
endDocumentation
The full documentation is published on hex.
The following modules are provided;
Configuration
The following can be configured.
config :rabbit_mq,
amqp_url: "amqp://guest:guest@localhost:5672",
heartbeat_interval_sec: 60,
reconnect_interval_ms: 2500,
max_channels_per_connection: 16amqp_url; required, the broker URL.heartbeat_interval_sec; defines after what period of time the peer TCP connection should be considered unreachable. Defaults to30.reconnect_interval_ms; the interval before another attempt to re-connect to the broker should occur. Defaults to2500.max_channels_per_connection; maximum number of channels per connection. Also determines the maximum number of workers per Producer/Consumer module. Defaults to8.
⚠️ Please consult the Channels Resource Usage guide to understand how to best configure :max_channels_per_connection.
⚠️ Please consult the Detecting Dead TCP Connections with Heartbeats and TCP Keepalives guide to understand how to best configure :heartbeat_interval_sec.
Balanced performance and reliability
The RabbitMQ modules are pre-configured with sensible defaults and follow design principles that improve and delicately balance both performance and reliability.
This has been possible through
- a) extensive experience of working with Elixir and RabbitMQ in production; and
- b) meticulous consultation of the below (and more) documents and guides.
⚠️ While most of the heavy-lifting is provided by the library itself, reading through the documents below before running any application in production is thoroughly recommended.
- Connections
- Channels
- Reliability Guide
- Publisher Confirms
- Consumer Acknowledgements and Publisher Confirms
- Consumer Acknowledgement Modes and Data Safety Considerations
- Consumer Prefetch
- Production Checklist
- RabbitMQ Best Practices
- RabbitMQ Best Practice for High Performance (High Throughput)
Consistency
The RabbitMQ modules are designed to help you build consistent, SDK-like Consumers and Producers.
defmodule CustomerProducer do
use RabbitMQ.Producer, exchange: "customer"
@doc """
Publishes an event routed via "customer.created".
"""
def customer_created(customer_id) do
opts = [
content_type: "application/json",
correlation_id: UUID.uuid4(),
mandatory: true
]
payload = Jason.encode!(%{version: "1.0.0", customer_id: customer_id})
publish(payload, "customer.created", opts)
end
@doc """
Publishes an event routed via "customer.created".
"""
def customer_updated(customer_data) do
opts = [
content_type: "application/json",
correlation_id: UUID.uuid4(),
mandatory: true
]
payload = Jason.encode!(%{version: "1.0.0", customer_data: customer_data})
publish(payload, "customer.created", opts)
end
endTODO
A quick and dirty tech-debt tracker, used in conjunction with Issues.
-
[ ] Add support for notifying the parent producer when a publisher
nackoccurs.