2017-06-05 1 views
1

2つの外部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 

新しい、私はプロセスと監督者について読んでてきました。私の質問です:ここでそれらを使うのは合理的ですか?メソッドを速くしたり、パフォーマンスを上げたり、フォールトトレランスをここで実装して改善したりできますか?

答えて

0

パフォーマンスやフォールトトレランスを向上させることができるかどうかを具体的に質問したので、はいと答えたと思います。 Task.asyncを使用すると、リクエストが互いに依存するように見えないため、リクエストを並行して実行できます。データベースの挿入と同じです。私はおそらくここでTask.Supervisorを使用します。また、失敗した場合に再試行するように設定することもできます。要求とデータベースの挿入が冪等であることを確認して、重複しないように注意してください。例えば

、その後

import Supervisor.Spec 

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

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

​​
+0

おかげでジェシーが、これは良い情報です。 – ntonnelier

関連する問題