Scala Akka演员,消息验证

时间:2013-11-13 11:47:40

标签: validation scala akka

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

我有一个处理大量消息的actor。每条消息都可以有自己的内容结构验证。我想知道是否有适合(近乎无缝的)消息验证的模式。例如,如果我做了

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

有更好的模式吗?

1 个答案:

答案 0 :(得分:1)

在我看来,最好不要在发送方那边验证消息,而是在演员方面。

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

同时查看ooyala人的演示文稿 - http://slideshare.net/EvanChan2/akka-inproductionpnw-scala2013。从第14张幻灯片看,看看他们如何在演员身上构建可堆叠的特征