我有三个演员来处理CQRS场景。 ProductWorkerActor处理命令部分,ProductQueryWorkerActor处理查询部分和ProductStateActor处理状态部分。通过AKKA中的工人演员检索状态演员
我处理查询的方法是使用:
ProductQueryWorkerActor.Ask<ProductState>("give-me-product-state-for-product-1000")
从ProductQueryWorkerActor代码:
if (message == "give-me-product-state-for-product-1000")
{
var actor = Context.ActorSelection("akka://catalogSystem/user/productState/1000");
var psDTO = actor.Ask<ProductStateDTO>(message).Result;
Sender.Tell(ps);
}
请忽略路径被用来访问产品的状态。它是硬编码的,有意使代码读取更简单。
我应该使用问我在这种情况下,已经使用检索产品的状态?被称为期货吗?
我是否应该将DTO的状态暴露给外部工作而不是演员本身?
要更改产品的任何状态,我应该处理的消息处理ProductWorkerActor或ProductStateActor本身?在第二种情况下,ProductWorkerActor将消息发送到ProductStateWorker,所述ProductStateWorker处理该消息,改变状态和发送另一消息ProductWorkerActor,它通过了验证,并改变了状态。
关于第1和第2点的优秀答案我有灵感将杰克艾伦的Essential AKKA书中的工作者演员和国家演员分开。因为他建议分开国家和行为。 –
'actor.Forward'不起作用,因为actor是ActorSelection。 ActorSelection没有Forward扩展。我不确定如何从ActorSelection中获取潜在的演员,以便我可以进行转发。 –
转发基本上相当于'Tell(message,Sender)'。在处理演员选择时也要小心 - 如果他们不是非常必要的话,不应该使用他们。那里有一些[讲座](https://petabridge.com/blog/when-should-I-use-actor-selection/)。 – Horusiath