我的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}}。添加能够占用一半工作量的第二个节点基本上可以缩短处理时间。