Elixir:跨机器拆分Genserver任务

时间:2017-10-13 02:41:19

标签: erlang elixir gen-server genstage

我的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中的任务),如果前一个机器忙,等待任务完成。我该怎么做呢?

我已经阅读了关于分布式任务的guide,我只是不确定如何设计它以便1.它在机器之间分裂,并且2.它知道何时分割,即,当它忙时:

task = Task.Supervisor.async {Something, :"server@other-machine"}, fn ->
  {:ok, node()}
end

我知道它涉及这样的安排,但我不知道从哪里开始。任何人都有这方面的经验吗?

更新

我需要的原因Processor.process_document(document)需要大约30秒才能完成,而且一次只能运行一个。{1}}。添加能够占用一半工作量的第二个节点基本上可以缩短处理时间。

0 个答案:

没有答案