bt-maps

bt-maps

I am new to elixir and have gone through much of the initial learning materials (books and courses). As a first project, I would like to recreate this service fabric (actor model-type framework) sample application. Specifically, I am looking for advice on best practices to implement the Child-Parent Process Flow and aggregation using the elixir concurrency model. I have a way forward with the API and dashboard parts of the application using phoenix.

Sample app architecture docs

Thanks in advance
Brent

Showing Posts 1 to 5

ruslandoga

ruslandoga

It seems like the sample uses something similar to Orleans. There is an erlang implementation of this general idea of a virtual actor as well, called erleans. The building block of both is a so-called grain (more info on Introduction | Microsoft Orleans Documentation), which is (in my understanding) just a process whose state can be persisted to DB, stopped, and restarted at a later point in time.

It seems that what the sample app wants is to have some sort of a reverse hierarchy of these grains that wake up on incoming transactions, execute them, and “pass it up” to a parent process (possibly starting it) and go back to sleep with some updated state.

It’d be harder to do in plain elixir unless it’s ok to have all processes running all the time, even when there are no transactions to process.

cmo

cmo

Child process (e.g. GenServer) can keep a reference to the parents PID or name in it’s state. When it receives a request it processes and sends it to the parent.

Could use Registry to register and lookup names too.

Note that you can use Phoenix PubSub to message between actors. You won’t face the same restrictions listed in that doc re: only sending to clients.

ruslandoga

ruslandoga

It’s not strictly necessary to keep parent pids in the state, since they are already stored in the process dictionary under $ancestors for genservers and co.

From Erlang -- proc_lib

Some useful information is initialized when a process starts. The registered names, or the process identifiers, of the parent process, and the parent ancestors, are stored together with information about the function initially called in the process.

[parent | grandparents] = Process.get(:"$ancestors") # has the whole parent chain
cmo

cmo

That’s cool, I didn’t know that. :grinning:

If the supervision tree follows the diagram that would work well. Not sure if that is desired, maybe some supervisors in between but then you could grab the grandparent…

bt-maps

bt-maps OP

Very helpful. Thanks for the insights

Brent

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
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
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews