这是一个架构/设计表单问题,因为我有一个名义上可行的解决方案。我想看看是否有更好的方法......
我有一个处理大量消息的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
有更好的模式吗?
答案 0 :(得分:1)
在我看来,最好不要在发送方那边验证消息,而是在演员方面。
使用通用验证逻辑包装您的receive
方法并混合一些验证实现。
同时查看ooyala人的演示文稿 - http://slideshare.net/EvanChan2/akka-inproductionpnw-scala2013。从第14张幻灯片看,看看他们如何在演员身上构建可堆叠的特征