D3vd

D3vd

Communicating between multiple phoenix applications

Hey!

I have two phoenix applications and would like to transfer data between them. What is the most efficient way to do this?

The first approach I thought about was to make http requests to each app via the already existing rest apis. I usually try not to make rest api calls to communicate within my micro services, as I feel they add an extra overhead in this case. But I am open to use it if there isn’t a better way.

I my search I came across this post
Efficient way to establishing communication between Phoenix applictions

One of the comments mentioned that Distributed Erlang could be used to communicate between two nodes. This was pretty exciting as I thought I could call a function in App1 from App2, kinda like rpc which was exactly what I was looking for.

So I connected both the apps in the same cluster and ran them in iex. I tried calling a function in App Foo from the iex in App Bar but I got Foo.Context is not available.

defmodule Foo.Context do
  def func(), do: "Hello"
end

Is it possible to just call a function from another phoenix app like

defmodule Bar.Context do
  def func(),  do: Foo.Context.func()
end

I was only able to find examples where functions from a different node were called from iex but nothing from the code. Is this even possible?

I am pretty new to elixir and phoenix, so please correct me if I got something wrong.

Marked As Solved

mpope

mpope

So you can call some code on a remote node using the RPC module’s call/4 function, but I think a better method is to use a GenServer process that is registered on both nodes. Then you’ll have a well defined handler to use on either node when you want to transfer data. The function GenServer.call/3 function’s first argument is a server() type. Most examples send pass a pid or name as the first argument, like:

{:ok, _} = GenServer.start_link(Stack, [:hello], name: MyServer)
GenServer.call(MyServer, :message)

However, instead of MyServer, you can pass a tuple of {atom(), node()}. So you can change the call to

GenServer.call({MyServer, :node2}, :message)

replacing :node2 with the name of the other node.

Also Liked

D3vd

D3vd

I like this GenServer process approach. I haven’t used GenServer before, but I will give it shot.

Thanks a lot!

vfsoraki

vfsoraki

What @mpope wrote will be the answer.

I just want to mention Erlang global module which can be used to register a name globally in a cluster.

As a note, if you want to register an OTP behavior using :global, pass {:via, :global, SomeName} as name to start_link function

mpope

mpope

global works, but I think I’d reach for pg for their brief problem statement.

Last Post!

mpope

mpope

global works, but I think I’d reach for pg for their brief problem statement.

Where Next?

Popular in Questions Top

Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

Other popular topics Top

vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 49084 226
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

We're in Beta

About us Mission Statement