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 向它发送消息并期待稍后回复,但是:
- 让一个演员负责这个资源对我来说感觉有点脆弱
- 任何 "client" actor 应该如何知道如何联系这个资源管理器 actor?最好是在像
/user/rest-manager
这样的众所周知的位置创建它并使用演员选择,还是尝试将其 ActorRef
传递给需要它的每个演员更好(但意味着它需要在很多不使用它的演员中流传下来,这样他们就可以反过来流传下去)
此外,当 10 个连接已经在进行时,如何处理 "blocking" 客户端参与者,特别是因为我使用的是非阻塞 I/O?将消息重新发送到 self
(可能在一段时间后)作为等待模式是否是最佳做法?
我还想到了一种基于令牌的方法,其中资源管理器参与者可以用 "access tokens" 回复需要访问资源直到耗尽的客户端参与者。然而,这意味着客户端演员一旦完成就应该 "return" 令牌,这听起来不太理想,而且我还需要迎合演员在没有返回令牌的情况下死亡(我猜有某种过期超时).
处理这种情况的模式/最佳做法是什么?
更新:表明我正在使用非阻塞 I/O
我的建议是:
- 使用 Error Kernel 模式,因为正如您所说,REST 端点是脆弱的代码(I/O 操作可能会产生任何类型的错误)。换句话说,Master/Worker actor 层次结构,其中 Workers 执行工作,而 Master 执行任何监督
- Akka 路由 功能可以处理连接限制,在您的情况下,路由数量为 10。这也属于 Master/Worker 类别
- 寻址 - 两种方式都不错
- 连接超时 - 由客户端代码处理,因为在大多数网络库中总是如此。
我正在学习 Akka,我正在努力寻找一个好的模式来在整个 actor 层次结构中共享单一的、有限的资源。
我的用例是我有一个 HTTP REST 端点,我在任何时候都只允许 10 个同时连接。层次结构不同级别的不同参与者需要能够进行 HTTP REST 调用。我正在使用非阻塞 I/O 发出 HTTP 请求 (AsyncHttpClient)。
显而易见的解决方案是让一个 actor 负责这个 REST 资源,让任何想要访问它的 actor 向它发送消息并期待稍后回复,但是:
- 让一个演员负责这个资源对我来说感觉有点脆弱
- 任何 "client" actor 应该如何知道如何联系这个资源管理器 actor?最好是在像
/user/rest-manager
这样的众所周知的位置创建它并使用演员选择,还是尝试将其ActorRef
传递给需要它的每个演员更好(但意味着它需要在很多不使用它的演员中流传下来,这样他们就可以反过来流传下去)
此外,当 10 个连接已经在进行时,如何处理 "blocking" 客户端参与者,特别是因为我使用的是非阻塞 I/O?将消息重新发送到 self
(可能在一段时间后)作为等待模式是否是最佳做法?
我还想到了一种基于令牌的方法,其中资源管理器参与者可以用 "access tokens" 回复需要访问资源直到耗尽的客户端参与者。然而,这意味着客户端演员一旦完成就应该 "return" 令牌,这听起来不太理想,而且我还需要迎合演员在没有返回令牌的情况下死亡(我猜有某种过期超时).
处理这种情况的模式/最佳做法是什么?
更新:表明我正在使用非阻塞 I/O
我的建议是:
- 使用 Error Kernel 模式,因为正如您所说,REST 端点是脆弱的代码(I/O 操作可能会产生任何类型的错误)。换句话说,Master/Worker actor 层次结构,其中 Workers 执行工作,而 Master 执行任何监督
- Akka 路由 功能可以处理连接限制,在您的情况下,路由数量为 10。这也属于 Master/Worker 类别
- 寻址 - 两种方式都不错
- 连接超时 - 由客户端代码处理,因为在大多数网络库中总是如此。