【问题标题】:Retry a Job from where it failed In Elixir在 Elixir 中重试失败的工作
【发布时间】:2018-04-13 22:20:04
【问题描述】:

我有一个问题,我正在用 Elixir 替换预测拨号器。到目前为止,它已经超出了所有人的预期。但是,我面临一个问题。假设所有第三方依赖项都按预期工作,这段代码运行良好,

def perform(phonebook_contacts, ...) do
  alias FSModEvent.Connection, as: C

  for x <-Enum.chunk(phonebook_contacts, 100, 100, []), y <- x  do 
    unless Telephony.user_balance(account_number) <= 0 do
      Task.start_link(fn -> 
        # some background job to dailout phone number y
      end)
    # :timer.sleep(1000);
  end

  ...
end

phonebook_contacts 可以是一个包含多达 20 万个数字的列表

我正在使用exq。如果外部因素导致作业失败,当它被重试时,它从列表的开头开始,有没有办法我可以从作业失败的最后一个联系人重试?

假设[12,34,56,78,90…]

如果作业在56 失败,它会再次从12 重新启动,它有办法从78 继续(有点失败),...?或处理此用例的更好方法

曾建议可能将作业的状态存储在 redis 中并从那里重试,但我不知道该怎么做。

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    这里的简单方法是启动另一个进程,您可以使用该进程存储每个单独作业的“成功状态”。然后,在任何类型的重新启动期间,您都可以检查作业是否已经运行/完成。

    Agent 是很好的、易于使用的过程,用于跟踪不需要执行更复杂交互的少量状态。

    例如:

    def perform(phonebook_contacts, ...) do
      completed_agent = Agent.new(fn -> MapSet.new() end)
      # the Enum code...
        Task.start_link(fn ->
          completed? = Agent.get(completed_agent, &(MapSet.member?(&1, y)))
          unless completed? do
            # the dialout code...
    
            if dialout_code_succeeded do
              Agent.update(completed_agent, &MapSet.put(&1, y))
            end
          end
      end)
    end
    

    现在,这可能是最天真的方式来做到这一点,而且可能不是特别高效。请务必注意,Agent.get/3Agent.update/3 中提供的匿名函数有效地阻止任何其他进程的代理,因此您希望这些函数运行得非常快,否则您可能会导致尝试使用代理的其他进程超时。

    【讨论】:

      【解决方案2】:

      您可以使用起始索引作为参数创建递归作业。

      如果作业失败,你救它并用当前索引加一来调用自己。

      在你的工作中你不再使用 phonebook_contacts 来迭代,但是这个函数

        defp enum_from(phonebook_contacts, index) do
          Enum.slice(phonebook_contacts, index, Enum.count(phonebook_contacts))
        end
      

      当你第一次调用你的工作时,你在索引 0 处调用它。

      通过在索引之后递归调用作业来捕获异常并跳过有问题的数字

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 2016-06-07
        • 2021-01-07
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        相关资源
        最近更新 更多