Process 通过elixir流程和主管改进服务方法

Process 通过elixir流程和主管改进服务方法,process,elixir,phoenix-framework,erlang-supervisor,Process,Elixir,Phoenix Framework,Erlang Supervisor,我正在构建一个服务,它将向两个外部API发出请求。结果将保存在本地数据库中 大致上,该方法的工作原理如下: def make_requests(conn, params) do case Service1.request(params) do {:ok, response1 } -> case Service2.request(params) do {:ok, response2 } -> conn

我正在构建一个服务,它将向两个外部API发出请求。结果将保存在本地数据库中

大致上,该方法的工作原理如下:

def make_requests(conn, params) do
  case Service1.request(params) do
    {:ok, response1 } ->
      case Service2.request(params) do
        {:ok, response2 } -> 
          conn 
          |> Repo.insert(response1)
          |> Repo.insert(response2)
          |> render("show.json")
        {:error, message} -> 
          conn |> render("error.json")
      end
    {:error, message } -> 
      conn |> render("error.json")
  end
end

对于长生不老药,我一直在阅读有关流程和主管的文章。我的问题是:在这里使用它们有意义吗?我是否可以通过在此处实现这些方法来提高该方法的速度、性能或容错能力?

由于您特别询问这是否可以提高性能或容错能力,我认为答案是肯定的。您可以使用Task.async并行执行请求,因为请求看起来并不相互依赖。数据库插入也一样。我可能会在这里使用一个。您还可以将其配置为在出现故障时重试,只需确保请求和数据库插入是幂等的,以避免出现重复

比如说,

import Supervisor.Spec 

children = [ 
  supervisor(Task.Supervisor, [[name: ExampleApp.TaskSupervisor, restart: :transient]]), 
] 

{:ok, pid} = Supervisor.start_link(children, strategy: :one_for_one)
那么


由于您特别询问这是否可以提高性能或容错性,我认为答案是肯定的。您可以使用Task.async并行执行请求,因为请求看起来并不相互依赖。数据库插入也一样。我可能会在这里使用一个。您还可以将其配置为在出现故障时重试,只需确保请求和数据库插入是幂等的,以避免出现重复

比如说,

import Supervisor.Spec 

children = [ 
  supervisor(Task.Supervisor, [[name: ExampleApp.TaskSupervisor, restart: :transient]]), 
] 

{:ok, pid} = Supervisor.start_link(children, strategy: :one_for_one)
那么