以下のようないくつかのユースケースがあります。
1) createUser
API 呼び出しはフロントエンド経由で行われます。この呼び出しが成功すると、データが db に正常に保存されたことを意味し、フロント エンドに成功を返します。API コントラクトは、フロントエンドとバックエンドの間で終了します。
2) バックエンドは、CreateUser
ユーザーをサード パーティ アプリに作成するイベントを生成して起動する必要があります (例として、createUser を外部エンタイトルメント システムに作成すると言えます)。これは完全に非同期でバックグラウンド タイプのプロセスであり、クライアントはそれを認識しておらず、この API の成功または失敗を待機していません。ただし、このCreateUser
イベントへのすべての呼び出しは、監査および修復 (失敗の場合) の目的で、失敗または成功と共にログに記録する必要があります。
最初のアプローチFuture
は、これらの非同期イベント用にベースの非同期 APIを設計し(アプリの残りの部分Futures
はasync
頻繁に使用されます)、着信イベントと結果の成功/失敗を db に記録することです。
2 番目のアプローチは、Akka を使用し、これらのイベントに対して個別のアクターを用意することです (例:CreateUser
は 1 つの例です)。次のように見えるかもしれません
class CreateUserActor extends Actor {
def receive = {
case CreateUserEvent(user, role) =>
val originalSender = sender
val res = Future {
blocking {
//persist CreateUserEvent to db
SomeService.createUser(user, role)
}
}
res onComplete {
case Success(u) => //persist success to db
case Failure(e) => //persist failure to db
}
}
3 番目のアプローチAkka Persistenceを使用して、イベント ソーシング ジャーナリングを使用してイベントの永続化をすぐに実行できるようにします。ただし、イベントの成功または失敗の 2 番目の永続性は手動になります (そのためのコードを記述します)。この 3 番目のアプローチは有望に見えるかもしれませんが、イベントを永続化するために Akka の永続性に依存しているため、うまくいかない可能性があります。など)ここでたくさん購入するかどうかわかりませんか?
2 番目のアプローチでは、両方のケース (着信イベントとイベントの結果) に対して永続的なコードを記述する必要があります。
最初のアプローチはあまり有望に見えないかもしれません。
そのように聞こえるかもしれませんが、「意見に基づく」ように聞こえるかもしれない質問を作成するつもりはありませんでしたが、言及されたアプローチまたはここにうまく適合する可能性のある他のものについて、その長所/短所を備えた真のアドバイスに応えようとしました.
参考までに: この特定のアプリケーションはプレイ サーバー上で実行されるプレイ アプリケーションであるため、アクターの使用は問題になりません。