smanza

smanza

Hello.

I saw on many posts and implementations for TCP connection management managed using GenServer or GenStatem, which is great with all the message passing, reactive, etc…
However, it can have strong risk of bottlenecks and overloading of the mailbox;

I ran some benchmarks, and tested an implementation of a TCP client using ETS to manage the socket.
Even if it’s not use message passing and synchronous reading of the socket, it still way faster, and even more when we add load or parallelization. So I don’t get timeouts easily.
It seems also a win/win as there is no need or less for process pooling, which tends to reduce the overhead.

What do you think about managing TCP connection by ETS ?

Thanks

Showing Posts 1 to 10

Matsa59

Matsa59

Hello

I’m not sure to understand what/how/why you use ETS for TCP connection but have take a look on Registry ? Pretty sure it could help you a lot :wink:

I don’t know how you manage the TCP state in ETS (what happen if a TCP tunel is closed etc). In registry, you’ll follow the erlang mind of wrap everything in a process to let it crash.

Edit : I’m interesting to see some code if you can ^^

smanza

smanza OP

The reason is the overload of the mailbox of the GenServer. I also tried GenStage but not better than GenServer.

For connection closed and family , I ended up checking on each message the tuple return , to determine if I need to reconnect or not. It’s more like as demand.

A better version could be to use a set of
socket (like a pool but without server) and switch one of them if the socket is closed, while reconnecting in background .

Matsa59

Matsa59

It’s about connections from your server or to your server ?

If it’s from your server, GenServer is not a good solution (and registry will not help you). GenStage is not a big game changer (it will only help you to manage data flow).

But you can spawn process and monitor them from a GenServer. So the GenServer will be aware if a process is down or w.e (take a look at spawn_link, spawn, monitor, process etc)

I suppose you create x connections through x endpoints. 1 connection per endpoint should be enough. Maybe a lib like gun could also be a good resource

smanza

smanza OP

It is to my server, as a client. In fact I used GenServer for the connection acceptor on the server side.

I did use GenServer for client with active: :once and noreoply while keeping the requesters during but as some point there are some bottleneck or mailbox overload (issue with unbounded queue).

So I did try multiple solutions semaphore, ets …

dom

dom

Have you looked into how Ecto manages database connection pools? DBConnection — db_connection v2.10.1

Each connection is a process, but once you checkout a connection, you can use the socket directly, without going through the process that owns it. I’d be curious if this library work for your use case or if you have different constraints.

smanza

smanza OP

Indeed it uses ETS to store the socket and pass it to the client during a given time internal.

marcin

marcin

How about using N gen servers, and shard connections between them?
To find the processes pid, use a Register

rvirding

rvirding

Creator of Erlang

Have you tried using {:active,:once} to limit when incoming messages are sent to your TCP process?

smanza

smanza OP

Yes I did try with both client and server , but the issue I’m facing it is not from the TCP stack but from the clients wanting to send message and wait response from this socket. (Typically from the GenServer call and no GenServer info callback). For example to have hundred of parallel requests in the same time.

smanza

smanza OP

I tried this approach as well, but no better than ETS as socket holder.

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
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
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
psy-q
I’m trying to set up Emacs with elixir-ls via lsp-mode and credo via Flycheck. This should mostly be preconfigured as Flycheck picks up c...
New

Other Trending Topics Top

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
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
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
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
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews