0

以下のようないくつかのユースケースがあります。

1) createUserAPI 呼び出しはフロントエンド経由で行われます。この呼び出しが成功すると、データが db に正常に保存されたことを意味し、フロント エンドに成功を返します。API コントラクトは、フロントエンドとバックエンドの間で終了します。

2) バックエンドは、CreateUserユーザーをサード パーティ アプリに作成するイベントを生成して起動する必要があります (例として、createUser を外部エンタイトルメント システムに作成すると言えます)。これは完全に非同期でバックグラウンド タイプのプロセスであり、クライアントはそれを認識しておらず、この API の成功または失敗を待機していません。ただし、このCreateUserイベントへのすべての呼び出しは、監査および修復 (失敗の場合) の目的で、失敗または成功と共にログに記録する必要があります。

最初のアプローチFutureは、これらの非同期イベント用にベースの非同期 APIを設計し(アプリの残りの部分Futuresasync頻繁に使用されます)、着信イベントと結果の成功/失敗を 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 番目のアプローチでは、両方のケース (着信イベントとイベントの結果) に対して永続的なコードを記述する必要があります。

最初のアプローチはあまり有望に見えないかもしれません。

そのように聞こえるかもしれませんが、「意見に基づく」ように聞こえるかもしれない質問を作成するつもりはありませんでしたが、言及されたアプローチまたはここにうまく適合する可能性のある他のものについて、その長所/短所を備えた真のアドバイスに応えようとしました.

参考までに: この特定のアプリケーションはプレイ サーバー上で実行されるプレイ アプリケーションであるため、アクターの使用は問題になりません。

4

1 に答える 1

2

これは Play アプリケーションであるため、バックエンド ワーカー アクターへの参照を必要とせずに、Akka イベント ストリームを使用してイベントを発行できます。

たとえば、 に次のように記述しactors/Subscriber.scalaます。

package actors

import akka.actor.Actor
import model._

class Subscriber extends Actor {
  context.system.eventStream.subscribe(self, classOf[DomainEvent])

  def receive = {
    case event: DomainEvent =>
    println("Received DomainEvent: " + event)
  }
}

...そして次のようなものmodel/events.scala

package model

trait DomainEvent

case class TestEvent(message: String) extends DomainEvent

...コントローラーは、次のように TestEvent を発行できます。

object Application extends Controller {
  import akka.actor.Props
  import play.libs.Akka

  Akka.system.actorOf(Props(classOf[actors.Subscriber]))  // Create the backend actor

  def index = Action {
    Akka.system.eventStream.publish(model.TestEvent("message"))  // publish an event
    Ok(views.html.index("Hi!"))
  }
}
于 2014-07-03T22:05:20.817 に答える