0

这是一个架构/设计形式的问题,因为我有一个名义上可行的解决方案。我想看看有没有更好的方法...

我有一个处理许多消息的演员。每条消息都可能有自己的内容结构验证。我想知道是否有适合(几乎无缝的)消息验证的模式。例如,如果我做了

val f:Future[Any] = actorRef ask MyMessage(invalidContent)

我可以期待回来:

f = Future.failure(ValidationException(someMessage))

目前我已经通过创建一个继承的包装器来实现这一点

trait ValidatingActorRef[-T] {

  def actorRef:ActorRef

  def validate:PartialFunction[T, Option[ValidationException]]

  def ask(message:T)(implicit timeout:Timeout):Future[Any] =
    validate
      .lift(message)
      .flatten
      .map(t => Future.failed(t))
      .getOrElse(akka.pattern.ask(actorRef, message))
}

给我

val myActorRefWrapper = new ValidatingActorRef[MyMessages] {  

  val actorRef = system.system.actorOf(Props[MyActor])

  val log = {

    case MyMessage(content) if content == badContent =>
      BadContentValidationException("you have bad content")
  }

}

我在这里得到的是一个验证响应,而不必在演员邮箱上浪费时间,或者处理未来。然而,包装方法不是很完美,我已经明确地连接了一个 ValidatingActorRef,而不仅仅是一个 ActorRef

有更好的模式吗?

4

1 回答 1

1

在我看来,最好不要在发送者端验证消息,而是在参与者端验证消息。

只需receive使用通用验证逻辑包装您的方法并混合一些验证实现。

另请查看 ooyala 家伙的演示文稿 - http://slideshare.net/EvanChan2/akka-inproductionpnw-scala2013。从第 14 张幻灯片中查看它们如何在演员身上构建可堆叠的特征

于 2013-11-14T04:47:00.333 回答