Akka:这是使用Actors构建REST Web服务的正确方法吗?

时间:2016-09-21 13:01:25

标签: java rest playframework akka

我在做什么:

我正在使用play 2.5.7(java)并尝试构建REST应用程序。 当我在我的控制器上接到一个电话时,我问第一个演员,这个演员只能解决部分问题(获取额外数据),需要转发给另一个使用请求数据的演员和其他数据来更新更多数据,向另一个actor发送异步void调用(tell)并响应控制器。所有这些(4)演员都是@Injected在其他演员或控制者与Guice。

来电流程:

controller - (Patterns.ask) - > actor1 - (actor.forward) - > actor2 - (actor.forward) - > actor3(-tell-> actor4)和 - (sender()。tell) - >控制器。

问题:

这适用于前4个电话。然后在actor1.forward上每次连续请求都会失败; Patterns.ask超时。在actor1.forward工作之前的行上的System.out但不是实际的转发。无论超时值(尝试甚至20秒)。请求中未做任何更改;我每次只是点击邮递员的发送按钮。

我有两个问题:

  1. 为什么4?为什么在第4次请求后失败?是配置吗?我应该在配置中寻找什么?
  2. 我正在用演员正确的方式构建REST Web服务吗?
  3. 更新:我发现了这个问题;它是由于通过池消耗Redis连接而从未释放它们引起的。但我仍然存在的第二个问题是,我在这里做的是明智的吗?

1 个答案:

答案 0 :(得分:1)

当然,这可能是一个合理的设计。但我会考虑使用Future返回方法是否更易于维护,除非您的工作流需要在多个移动块或内部状态之间使用一些复杂的协议。如果您的处理不能很好地映射到异步方法调用,那么也可能值得考虑Akka Streams

基本上,演员是一个非常低级的工具。在您需要它们的范围内,我会尝试最小化应用程序的表面区域,直接使用它们。在可能的情况下,更高级别的抽象会更好。