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

Akka / Actors: Share a single, limited resource among the actor hierarchy

我正在学习 Akka,我正在努力寻找一个好的模式来在整个 actor 层次结构中共享单一的、有限的资源。

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

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

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

我还想到了一种基于令牌的方法,其中资源管理器参与者可以用 "access tokens" 回复需要访问资源直到耗尽的客户端参与者。然而,这意味着客户端演员一旦完成就应该 "return" 令牌,这听起来不太理想,而且我还需要迎合演员在没有返回令牌的情况下死亡(我猜有某种过期超时).

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

更新:表明我正在使用非阻塞 I/O

我的建议是:

  • 使用 Error Kernel 模式,因为正如您所说,REST 端点是脆弱的代码(I/O 操作可能会产生任何类型的错误)。换句话说,Master/Worker actor 层次结构,其中 Workers 执行工作,而 Master 执行任何监督
  • A​​kka 路由 功能可以处理连接限制,在您的情况下,路由数量为 10。这也属于 Master/Worker 类别
  • 寻址 - 两种方式都不错
  • 连接超时 - 由客户端代码处理,因为在大多数网络库中总是如此。