在Akka HTTP中传递请求上下文来完成是否是反模式?

时间:2019-05-08 20:51:05

标签: akka

想象一下,我有一个JobsEndpoint类,其中包含一个JobSupervisor类,然后有两个子演员RepositoryActorStreamsSupervisorActor。需要在适当的子actor中执行针对此最高级别JobSupervisor的不同请求的行为。例如,存储作业的请求将专门在RepositoryActor中处理,等等...

那么,我的问题是,通过消息通过这些参与者传递请求上下文,然后在有意义的情况下尽快完成请求,是否是一种反模式?

所以不要这样做:

Request -> Endpoint ~ask~> JobSupervisor ~ask~> RepositoryActor
           Response <- Endpoint <- JobSupervisor <-|return result

我可以在消息中传递RequestContext,例如StoreJob(..., ctx: RequestContext),然后在RepositoryActor中完成它。

1 个答案:

答案 0 :(得分:0)

我承认使用Akka的时间不长,但是我看到了一些改进的机会。

首先,您要链接“询问”调用以阻塞线程。在某些情况下,这是不可避免的,但我认为在您的情况下,这是可以避免的。阻塞线程时,可能会损害吞吐量。

我希望端点发送带有ActorRef的消息作为“答复”字段。这样,您不必阻止Endpoint和JobSupervisor参与者。每当Repository actor完成该操作时,它都可以将答复直接发送到Endpoint,而无需遍历中间商。

根据您的消息传递保证需求,端点可以在必要时实施重试和重复数据删除。

理想情况下,每个参与者都将拥有处理消息中的消息所需的一切。我不确定您的RequestContext包括什么,但我会考虑:

1)创建一个难吗?这会影响可测试性。如果RequestContext难以创建,我会选择只提取所需的成员,以便编写单元测试。

2)可以序列化吗?如果您在集群环境中部署actor系统,则需要序列化消息。简单数据持有者的邮件效果最好。