解决演员的正确方法是什么?

本文关键字:方法 是什么 解决 | 更新日期: 2023-09-27 18:13:32

我有1000个订单,我想为每个唯一的订单id创建一个参与者。在保证每个唯一的orderid只有一个参与者的情况下,安全创建这些参与者的最佳方法是什么?

我尝试过首先使用ActorSelection,然后如果我找不到具有该id的演员,我使用ActorOf来创建一个新的,但是当开始批量处理这些时,我会得到很多ActorNotFoundException,当我尝试使用ActorOf时,它会失败InvalidActorNameException。

的例子:

try
{
    actorRef = await actorSelection.ResolveOne(TimeSpan.FromMilliseconds(3000));
}
catch (ActorNotFoundException)
{
    actorRef = Actor.EwmsActorSystem.ActorOf<T>(actorId);
}

解决演员的正确方法是什么?

你应该使用Entity Per Child模式,也就是说,每个实体ID都有一个actor来生成子actor。您可以在World Crawler示例中查看示例。

简而言之,它应该是这样的:

var child = Context.Child(entityId.ToString());
if (child == ActorRefs.Nobody)
    child = Context.ActorOf(...); // spawn child actor here
child.Tell(message);

在子actor上设置ReceiveTimeout也是一种很好的做法,当它们空闲一段时间后杀死它们。