Tackles the problem of processing asynchronous jobs in reliable manner by relying on RabbitMQ.
You should also take a look at Ruby Tackle.
- It is ideal for fast microservice prototyping
- It uses sane defaults for queue and exchange creation
- It retries messages that fail to be processed
- It stores unprocessed messages into a dead queue for later inspection
Add the following to the list of your dependencies:
def deps do
[
{:tackle, github: "renderedtext/ex-tackle"}
]
end
Also, add it to the list of your applications:
def application do
[applications: [:tackle]]
end
To publish a message to an exchange:
options = %{
url: "amqp://localhost",
exchange: "test-exchange",
routing_key: "test-messages",
}
Tackle.publish("Hi!", options)
First, declare a consumer module:
defmodule TestConsumer do
use Tackle.Consumer,
url: "amqp://localhost",
exchange: "test-exchange",
routing_key: "test-messages",
service: "my-service"
def handle_message(message) do
IO.puts "A message arrived. Life is good!"
IO.puts message
end
end
And then start it to consume messages:
TestConsumer.start_link
If you consumer is broken, or in other words raises an exception while handling messages, your messages will end up in a dead messages queue.
To rescue those messages, you can use Tackle.republish
:
dead_queue_name = "my-service.test-message.dead"
options = {
url: "amqp://localhost",
qeueu: dead_queue_name,
exchange: "test-exchange",
routing_key: "test-messages",
count: 1
}
Tackle.republish(options)
The above will pull one message from the dead_queue_name
and publish it on the
test-exchange
exchange with test-messages
routing key.
To republish multiple messages, use a bigger count
number.