AMQP RPC Client/Server templates 

Warning! POC quality!
Goals
- Reduce boilerplate
- Handle reconnects
- Messages housekeeping
- Logging
- Monitoring
- Use fuse
- Content negotiation
Fuse
Fuse helps reduce latency when something goes wrong with RabbitMQ or RPC server side by breaking circuit and returning immideately. Fuse can be configured via fuse_name and fuse_opts keys. We trying to maintain sensible default for those.
Monitoring/Instrumenting
Clients can be instrumented using built-in metrics plugins. Currenly implemented
- ETS-backed plugin (default)
- Prometheus plugin.
Example
Below is ‘classic’ RPC example from RabbitMQ tutorials rewritten using amqp_rpc:
Client:
defmodule Fibonacci do
use AMQP.RPC.Client, [exchange: "",
queue: "rpc_queue"]
def fib(n, timeout \\ @timeout) do
rpc(%{command_name: "fib",
args: n}, timeout)
end
endServer:
defmodule FibonacciServer do
use AMQP.RPC.Server, [exchange: "",
queue: "rpc_queue",
commands: [:fib]]
## adapted from https://gist.github.com/stevedowney/2f910bd3d72678b4cf99
def fib(0), do: 0
def fib(n)
when is_number(n) and n > 0,
do: fib(n, 1, 0, 1)
def fib(_), do: [error: "positive integers only"]
def fib(n, m, _prev_fib, current_fib)
when n == m,
do: current_fib
def fib(n, m, prev_fib, current_fib),
do: fib(n, m+1, current_fib, prev_fib + current_fib)
endInstallation
Available in Hex, the package can be installed as:
-
Add
amqp_rpcto your list of dependencies inmix.exs:
```elixir
def deps do
[{:amqp_rpc, "~> 0.0.7"}]
end
```-
Ensure
amqp_rpcis started before your application:
```elixir
def application do
[applications: [:amqp_rpc]]
end
```