It’s basically the same thing except that Process.sleep
also handles :infinity
,
dunno if it’s a common pattern or not.
Your current method will block your GenServer from handling system messages under the hood: your GenServer code is just a part of it.
You probably want a GenServer state with a queue of some sorts (could be a simple list for lifo processing if you don’t care about the order in which they arrive versus are being handled) in combination with a wait
flag.
If wait
is true, simply prepend the incoming request to the list of pending requests (or use a :queue
). If wait
is false and queue is empty, process the request by calling dispatch_request/1
. If queue is non-empty, queue the request and start processing the queue.
dispatch_request/1
should return either:
{:ok, response}
or{:wait, milliseconds}
if it sees a 429 response.
In the first case, if queue is non-empty, you process the next entry.
In the latter case, you queue the (failed) request, set wait
to true
and use Process.send_after/4
to send yourself a :resume message at a later point in time.
Something like that anyway.