我一直在花一些时间看Akka.Net tutorial,现在我开始构建自己的跟踪系统,该系统可以跟踪多辆公共汽车上的多个人。
到目前为止,我有一个BusManagerActor位于顶部,它跟踪所有总线,并有一个私有的busIds和IActorRefs字典。
然后我有一个BusActor,在其下面具有PersonActors,并保留一个personIds和IActorRefs字典。
每个PersonActor都有纬度/经度,因此我们可以跟踪每个人。这样,我就可以“平均”所有人的位置,并大致估算出公交车的位置。
我的消息类型为PersonActor.RecordLocation:
public class RecordLocation
{
public long RequestId { get; }
public string BusId { get; }
public string PersonId { get; }
public double? Latitude { get; }
public double? Longitude { get; }
public RecordLocation(long requestId, string busId, string personId, double? latitude, double? longitude)
{
RequestId = requestId;
BusId= busId;
PersonId = personId;
Latitude = latitude;
Longitude = longitude;
}
}
然后,我必须处理层次结构中每个参与者中的每个消息以转发它:
case PersonActor.RecordLocation trackMsg:
if (_busIdToActor.TryGetValue(trackMsg.BusId, out var actorRef))
{
actorRef.Forward(trackMsg);
}
else
{
Log.Info($"Creating BusActor for {trackMsg.BusId}");
var busActor = Context.ActorOf(BusActor.Props(trackMsg.BusId), $"bus-{trackMsg.BusId}");
Context.Watch(busActor);
busActor.Forward(trackMsg);
_busIdToActor.Add(trackMsg.BusId, busActor);
}
break;
我的问题有两个:
1)我应该这样吗?
2)如果是这样,我是否必须像对待自己一样处理在每个演员中发送的每条消息?