2

リクエストを処理するか、失敗した場合に別のアクターに処理を委譲するディスパッチャー アクターを実装しようとしています (実際には指数バックオフ アルゴリズムです)。ディスパッチャー アクターには、処理のルーティング方法を決定するために使用されるブール変数があります。

アクターの状態を維持するのは正しいですか? どのような問題が発生する可能性がありますか? 問題を回避するには、トランザクター (akka) または STM を使用する必要がありますか? (私は akka アクターを使用しています)

class DispatcherActor extends Actor {

   var backoff = false

   def receive = {
    case SendMessage(registrationId, message) => {
      if (backoff) {
        //put on the queue
        backoffManagerActor ! AddMessageToQueue(message)
      } else {
        httpClient.sendNotificationToClient(message, this)
      }
    }
    case BackoffCompleted => //set backoff to false
      backoff = false
    }

   def otherMethod = {
      backoff=true
   } 
}
4

1 に答える 1

4

アクターは状態を維持する必要がありますが、メッセージまたは内部で生成されたアクションに応答してその状態を変更するだけである場合、その理由を説明するのが最も簡単です。他のエンティティが状態を変更する必要がある場合は、メッセージを送信する必要があります。

あなたの場合、私は変わります

def otherMethod { backoff = true }

に、受け取る内に、

case BeginBackoff => backoff = true

そして、otherMethod を呼び出す予定だった人にBeginBackoff代わりに送信してもらいます。(バックオフ メッセージを優先的に処理する必要がある場合は、アクターに関する以前の質問への回答などで他の人が示した 2 レベルの受信を使用する必要があります。)

于 2011-02-12T23:50:54.483 に答える