Akka / Actors:在actor层次结构中共享一个有限的资源

时间:2015-12-10 11:42:36

标签: akka actor

我正在学习Akka,我正在努力寻找一个良好的模式,在整个行动者层级中共享一个有限的资源。

我的用例是我有一个HTTP REST端点,我只能在任何时候允许10个同时连接。层次结构的不同级别的不同actor需要能够进行HTTP REST调用。我使用非阻塞I / O来发出HTTP请求(AsyncHttpClient)。

显而易见的解决方案是让一个演员负责这个REST资源,并让任何想要访问它的演员向它发送一条消息并期待稍后的回复,但是:

  • 让一个负责这个资源的演员对我来说感觉有点脆弱
  • 任何"客户"演员知道如何联系这位资源经理演员吗?最好是在/user/rest-manager等知名位置创建它并使用actor选择,还是尝试将其ActorRef传递给需要它的每个actor(但这意味着它需要被许多不使用它的演员传下来,这样他们就可以把它传下去了)

此外,如何处理"阻止"当10个连接正在进行时客户端参与者,特别是因为我使用非阻塞I / O?最佳做法是将消息重新发送到self(可能在一段时间后)作为等待模式?

我还想到了一种基于令牌的方法,其中资源管理器的演员可以回复"访问令牌"到需要访问资源的客户端actor,直到用尽为止。然而,这意味着客户角色应该返回"一旦他们完成了令牌,这听起来并不理想,我也需要迎合演员死亡而不返回令牌(我想有某种过期时间)。

处理这种情况的模式/最佳做法是什么?

更新:表示我使用非阻止I / O

1 个答案:

答案 0 :(得分:1)

我的建议是:

  • 使用错误内核模式,正如您所说,REST端点是一个脆弱的代码(I / O操作可以生成任何类型的错误)。换句话说,主人/工人演员层次结构,工作人员在哪里工作,而师父做任何监督
  • 连接限制可以通过Akka 路由功能处理,其中路由的数量在您的情况下为10.这也属于主/工作类别
  • 寻址 - 无论哪种方式听起来都不错
  • 连接超时 - 由客户端代码处理,因为它总是在大多数网络库中完成。