Process 通过elixir流程和主管改进服务方法
我正在构建一个服务,它将向两个外部API发出请求。结果将保存在本地数据库中 大致上,该方法的工作原理如下: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
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)
那么