当前位置: 首页 > 知识库问答 >
问题:

Akka/参与者:在参与者层次结构中共享单一的、有限的资源

郎星汉
2023-03-14

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

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

显而易见的解决方案是让一个参与者负责这个REST资源,让任何想要访问它的参与者向它发送消息,并期望在稍后阶段得到回复,但是:

  • 只有一个演员负责这个资源对我来说有点脆弱
  • 任何客户端参与者应该如何知道如何联系这个资源管理器参与者?是最好在一个众所周知的位置创建它,比如/user/rest-Manager,并使用演员选择,还是最好尝试将它的ActorRef传递给每个需要它的演员(但这意味着它需要被许多不使用它的演员传下来,这样他们就可以反过来传下去)

此外,当10个连接已经在进行时,如何处理“阻塞”客户端参与者,特别是因为我使用的是非阻塞输入/输出?最好的做法是将消息重新发送到自己(也许过了一段时间)作为等待模式吗?

我还想到了一种基于令牌的方法,在这种方法中,资源管理器参与者可以使用“访问令牌”回复需要访问资源的客户机参与者,直到资源耗尽为止。然而,这意味着客户端参与者应该在完成后“返回”令牌,这听起来并不理想,而且我还需要满足参与者在没有返回令牌的情况下死亡的需求(我猜是有某种过期超时)。

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

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

共有1个答案

卢雅惠
2023-03-14

我的建议是:

  • 使用错误内核模式,因为正如您所说,RESTendpoint是一个脆弱的代码(I/O操作可以生成任何类型的错误)。换句话说,主/工人角色层次结构,其中工人负责工作,而主/工人负责任何监督
  • 连接限制可以由Akka路由特性处理,在您的情况下,路由的数量是10。这也属于大师/工人类别
  • 寻址-无论哪种方式听起来都不错
  • 连接超时-由客户端代码处理,这在大多数网络lib中都是如此
 类似资料:
  • 我有一个AKKA模型,有一个主管演员,他创造了许多儿童演员。子参与者将处理一个事件并将消息发送到另一个服务(例如Kafka topic)。 目前,我有一个静态共享类,它在子参与者之间共享以发送消息,但在参与者模型中,我认为最好使用参与者来实现这一目的。 我想知道我如何才能创造一个演员,儿童演员可以分享它。如果supervisor actor创建了MessagePublisher actor,那么孩

  • 例如,我有两个演员——一个家长演员和一个孩子演员。当父级收到消息时,它会产生消息中指定的尽可能多的子角色。如何测试此功能?有没有一种方法可以模拟上下文,或者其他一些方法来检查参与者的创建是否正确和数量是否正确? 更新:基于@Tim answer的解决方案 更改类别: 测试:

  • 我正在尝试在Scala上实现AKKA http和一些Actor。我用Akka创建了一个web应用程序。但我在一个或两个不同的路由上有这个错误/16。(显然是随机的): 服务器无法及时响应您的请求。请稍后再试! 你能给我解释一下为什么和怎么修吗?我对Akka真的是新手。 主类:

  • 我对Akka演员和演员模型有点困惑。从参与者A发送到参与者B的消息是否保持顺序?如何在本地/网络环境中实现这一点?据我所知,网络引入了可变延迟,如果M1的延迟为1秒,M2为0.5秒,那么消息M1和消息M2如何保持顺序?

  • 我正在尝试使用类型化执行器版本2.6.3和akka http版本10.1.11,而在非类型化执行器中都运行良好,现在我得到了编译错误

  • 我很难弄清楚我如何知道我的演员何时从非演员代码中完成。 尝试使用akka演员进行并行执行,这似乎真的很好,但我需要知道何时所有人都完成了。 我添加了一个监督者演员,产生演员来做工作,从监督者/父演员,我可以观看孩子的终止消息。 我需要从akka actor系统之外的常规java代码中得到帮助,以确定我的监督actor是否完成。 这是否可能,请提供指针。 谢谢哈瑞