> You've got half-a-dozen "pool" abstractions on github because it's actually sorta hard to run a pool on pure asynchronous messages when there is absolutely no way to send a message out to "somebody"
You can store receivers in ets table and implement any type of selection algorithm you want or have some process which selects workers. There is no default method, because one default method is not good for everyone and people will complain that it's not good for them. Implementing pools is easy in erlang, I've done tailored implementations for several projects.
> You also have to deal with mailboxes filling up
Yeah, unless you implement back-pressure mechanism like waiting for confirmation of receiving. In ALL systems you have to deal with filling queues.
> I wish there was a way to get synchronous messages to multiple possible listeners somehow in Erlang
You can implement receiver which waits for messages and exits when all are received or after timeout, it's trivial in erlang but I haven't needed it yet. Here is a simple example:
receive_multi(Acc,0) ->
Acc;
receive_multi(Acc,Num) ->
receive {special,Data} ->
receive_multi([Data|Acc],Num-1)
after 5000 ->
Acc
end.