想象一下,我有一个JobsEndpoint
类,其中包含一个JobSupervisor
类,然后有两个子演员RepositoryActor
和StreamsSupervisorActor
。需要在适当的子actor中执行针对此最高级别JobSupervisor
的不同请求的行为。例如,存储作业的请求将专门在RepositoryActor
中处理,等等...
那么,我的问题是,通过消息通过这些参与者传递请求上下文,然后在有意义的情况下尽快完成请求,是否是一种反模式?
所以不要这样做:
Request -> Endpoint ~ask~> JobSupervisor ~ask~> RepositoryActor
Response <- Endpoint <- JobSupervisor <-|return result
我可以在消息中传递RequestContext
,例如StoreJob(..., ctx: RequestContext)
,然后在RepositoryActor
中完成它。
答案 0 :(得分:0)
我承认使用Akka的时间不长,但是我看到了一些改进的机会。
首先,您要链接“询问”调用以阻塞线程。在某些情况下,这是不可避免的,但我认为在您的情况下,这是可以避免的。阻塞线程时,可能会损害吞吐量。
我希望端点发送带有ActorRef的消息作为“答复”字段。这样,您不必阻止Endpoint和JobSupervisor参与者。每当Repository actor完成该操作时,它都可以将答复直接发送到Endpoint,而无需遍历中间商。
根据您的消息传递保证需求,端点可以在必要时实施重试和重复数据删除。
理想情况下,每个参与者都将拥有处理消息中的消息所需的一切。我不确定您的RequestContext包括什么,但我会考虑:
1)创建一个难吗?这会影响可测试性。如果RequestContext难以创建,我会选择只提取所需的成员,以便编写单元测试。
2)可以序列化吗?如果您在集群环境中部署actor系统,则需要序列化消息。简单数据持有者的邮件效果最好。