sezaru

sezaru

Process pool with custom availability logic

I have a GenServer (I will call it A) that I connect to a external source (Actually it is a WebSockex process since I connect using websocket) and provide an API to communicate with that source.

A normal API call for A would be something like subscribe_to_channel(channel, callback) which means that it would subscribe that connection to a specific channel and pass all messages from that channel to the callback.

This works great, but the external source limits the number of channel subscriptions to a certain number per connection, let’s say 10. So, after 10 calls to subscribe_to_channel with specific channels, I would need to create a new A process with a new connection and use it to subscribe to new channels.

I was thinking in how to automatize this, what comes to mind is something like poolboy, where I can tell it to initialize like 5 A processes in a pool (and, as result, 5 websocket connections to the external source) and let it handle the subscribe_to_channel calls.

The idea is that A would have another method called available_subscriptions which returns the number of available subscriptions this process can handle. So, for example, if A have 1 channel subscribed, then available_subscriptions will return 9, for 2 channels, it will return 8, and so on.

From that, poolboy could check that function and decide to send the subscribe call to the process in the pool with the least subscriptions currently.

Now, as far as I know, I don’t think I can configure a behavior like that in poolboy, so my question is, is there any library that implements something like that? Or do I need to implement my custom pool with the above described logic?

Thanks!

Marked As Solved

tty

tty

AFAIK with poolboy you are on your own and have to implement your custom pooler. Process poolers and message queues are the two most commonly (re)written applications in Erlang/Elixir. Welcome to the club!

At last count we have 4 different implementations of process pooling in our production code. Yes, 4.

Where Next?

Popular in Questions Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
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
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New

Other popular topics Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
Nvim
Anybody knows a comprehensive comparison of Django and Phoenix, thanks for the help. Where are they similar? Where do they differ the m...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
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
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New

We're in Beta

About us Mission Statement