Communication between Elixir/Erlang services


I want to improve my understanding of what’s possible to do into a clustered application and if I can send message around it in a natural way. And also which are the rules/good practices to consider when you move from standalone to a cluster environment.

For example purposes, let’s say that I have two different services:

Service A - Product service (Product’s attributes e.g: name, sku, manufacturer)
Service B - Pricing service (Stores product id + current price)

Those services were either written on Elixir or Erlang.

1 - Would be ok to add both of them into the same cluster? Is there any known problem or implication? What’s the ‘recommended way’ here?

2 - Could I replace completely the communication between then that happened via http with Erlang messages?

2.1 - If yes, how would it be possible? Is rpc suitable for this?
2.2 - How would load balancing work on that scenario? Should I write it or is it transparent?

Thanks :slight_smile:

  1. No.
  2. Yes.
    1. I would not advise usage of rpc. Instead I would advise using regular message passing.
    2. You need to implement it for yourself.

Hello! Welcome to the forum :slight_smile:

It’s perfectly valid to create a cluster containing nodes with different code loaded on it if you wish. :slight_smile:

Yes, this is definitely an option. If you are happy to always use Erlang based languages then a message based API can work well.

At very high throughput you may want to move from the default single TCP connection for inter-node messages to multiple connections. Depending on the skill-set and knowledge of your team is may be harder to implement than more mainstream HTTP APIs (but you’ll have had to implement much less API boilerplate up until this point).

I would advise against using the rpc module much, it uses a single gen server per node and this creates a big bottleneck. Your API should be regular messages sent to named processes.

You will need to implement load balancing for your message based API. There may be libraries that provide this sort of functionality, depending on what you want to do.