Эликсир: разделение задач 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 секунд, и одновременно можно запустить только одну. Добавление второго узла, способного принимать половину рабочей нагрузки, существенно сокращает время обработки вдвое.

0 ответов

Другие вопросы по тегам