Load balancing processes with queues

I have spawned two processes A, B from a GenServer

Process A waits for three distinct messages and upon arrival of them, it runs a computation and sends the response to B

Consider the two messages as a part of a request and each request has an id
I wanted multiple requests to be queued/executed at the same time, so I changed the state to store the messages per request in a map.

Ex:

%{
  "request-1": % { message1: 123 },
  "request-4": % { message1: 145, message3: 45 },
  "request-6": % { message2: 56, message1: 345 },
}

Once the third message arrives, the entry from the Map is removed and the computation is run.
Lets assume that the requests are HTTP request and the computation is async. I don’t want the requests to wait for the execution of the previous one.

I want to have a pool of GenServers which keep processing these requests. The load balancing should be based on the queue of the processes inside the GenServer.

I’m not sure how to achieve this. Please let me know your thoughts.

From what I understand the messages have the following format:

{message_id :: ref(), parts :: part_1 | part_2 | part_3}

Once you accumulate all 3 parts the request is handled.

I would suggest using GenStateMachine instead. The GenServer receiving the request would spawn a GenStateMachine then track {message_id, pid()}. Each time it receives another part it sends it to the proper GenStateMachine. When all 3 parts are received the GenStateMachine would fulfill the request.

1 Like