D3vd

D3vd

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.

Showing Posts 1 to 4

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.

D3vd

D3vd OP

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.

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New

Other Trending Topics Top

KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews