java中如何调节actor之间的速度?

问题描述 投票:0回答:1

当序列中存在三个actor时——actor1 -> actor2 -> actor3 - 并且actor3的处理速度明显较慢,会导致actor1快速发送消息,从而导致actor3中消息积压。因此,随着时间的推移,程序的执行时间逐渐变慢,并且似乎有大量的垃圾收集(GC)使用。在这种情况下,如何使用java中的actor来解决这个问题?

任何想法或关键字将不胜感激。

java akka actor
1个回答
0
投票

一种有用的技术是 actor3 向 actor2 发出对消息的需求信号。例如,当actor3启动时,它可以向actor2发送一条消息,说“我可以处理10条消息”。当它收到来自 actor2 的第一条消息时,它会调度(或者可能发送)一条消息给自己并记录,当需要更新需求时,它可以再请求 1 条消息。发给自身的消息将与来自 actor2 的消息一起进入邮箱。当收到发送给自身的消息时,它会检查它还可以要求多少条消息,并向 actor2 发送另一条消息,以授予其发送更多消息的权限。

Actor2 基本上跟踪它有权向 actor3 发送多少条消息。如果它想向 actor3 发送消息,它必须缓冲该消息直到获得许可。 Actor2 同样向 actor1 发送请求/许可发送消息(当有任何消息缓冲发送给 actor3 时,它可能不会发出更多请求信号)。

这基本上是 Akka Streams 的背压协议。在 JVM 中,有更强大的交付保证,这基本上就足够了:在分布式情况下,可以对请求/发送权限等添加时间限制。

请注意,由于 Akka Streams 是该模式的一个经过严格“考验”的实现,因此可能值得考虑将参与者的逻辑移至流阶段:流 DSL 可以做很多事情,甚至可以将更多的事情表示为自定义

GraphStage
(甚至可以为舞台获得
ActorRef
并让舞台“带外”处理演员消息,尽管这种强大的能力伴随着巨大的责任)。

© www.soinside.com 2019 - 2024. All rights reserved.