我正在学习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
答案 0 :(得分:1)
我的建议是: