Эликсир: разделение задач Genserver на машины
Мой потребитель Genserver выглядит так:
defmodule Consumer do
use GenStage
def start_link() do
GenStage.start_link(__MODULE__, :ok)
end
def init(:ok) do
{:consumer, :ok, subscribe_to: [Broadcaster]}
end
def handle_events(documents, _from, state) do
for document <- documents do
Task.async(fn -> Processor.process_document(document) end)
end
{:noreply, [], state}
end
def handle_info({_reference, {_int_state, _msg}}, state) do
{:noreply, [], state}
end
def handle_info({:DOWN, _reference, :process, pid, int_state}, state) do
{:stop, int_state, state}
end
end
Я хочу "разделить" Processor
задачи (т. е. задачи в handle_events/3
) на нескольких машинах, если предыдущий занят, например, ожидает завершения задачи. Как мне это сделать?
Я прочитал руководство по распределенным задачам, я просто не уверен, как его спроектировать так, чтобы: 1. он распределялся по машинам, и 2. он знал, когда разбивать, т.е. когда он занят:
task = Task.Supervisor.async {Something, :"server@other-machine"}, fn ->
{:ok, node()}
end
Я знаю, что это требует какой-то договоренности, но я не уверен, с чего начать. У кого-нибудь есть опыт работы с такими вещами?
Обновить
Причина, по которой мне это нужно, в том, что Processor.process_document(document)
на завершение требуется ~30 секунд, и одновременно можно запустить только одну. Добавление второго узла, способного принимать половину рабочей нагрузки, существенно сокращает время обработки вдвое.