Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/deadtrickster/amqp_rpc

RPC Client/Server for amqp Elixir library
https://github.com/deadtrickster/amqp_rpc

amqp-rpc elixir fuse monitoring rabbitmq rpc-client

Last synced: about 1 month ago
JSON representation

RPC Client/Server for amqp Elixir library

Awesome Lists containing this project

README

        

# AMQP RPC Client/Server templates [![Build Status](https://travis-ci.org/deadtrickster/amqp_rpc.svg?branch=master)](https://travis-ci.org/deadtrickster/amqp_rpc) [![Hex.pm](https://img.shields.io/hexpm/v/amqp_rpc.svg?maxAge=2592000?style=plastic)](https://hex.pm/packages/amqp_rpc)

**Warning!** POC quality!

## Goals
- Reduce boilerplate
- Handle reconnects
- Messages housekeeping
- Logging
- Monitoring
- Use [fuse](https://github.com/jlouis/fuse)
- Content negotiation

### Fuse
[Fuse](https://github.com/jlouis/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](https://github.com/deadtrickster/amqp_rpc/blob/master/lib/amqp/rpc/stat/plugin.ex)
- ETS-backed plugin (default)
- [Prometheus](https://github.com/deadtrickster/prometheus.erl) plugin.

## Example

Below is 'classic' RPC example from [RabbitMQ tutorials](http://www.rabbitmq.com/tutorials/tutorial-six-elixir.html)
rewritten using amqp_rpc:

Client:

```elixir
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
end
```

Server:

```elixir
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)

end
```

## Installation

[Available in Hex](https://hex.pm/packages/amqp_rpc), the package can be installed as:

1. Add `amqp_rpc` to your list of dependencies in `mix.exs`:

```elixir
def deps do
[{:amqp_rpc, "~> 0.0.7"}]
end
```

2. Ensure `amqp_rpc` is started before your application:

```elixir
def application do
[applications: [:amqp_rpc]]
end
```