【问题标题】:How does Akka decide which Actor gets the Thread?Akka 如何决定哪个 Actor 获得线程?
【发布时间】:2023-03-11 14:44:01
【问题描述】:

假设我们有三个 Akka Actors、A、B 和 C 在只有一个 Thread 的调度程序上运行,然后会发生以下情况:

  1. A 收到一条消息并开始处理它
  2. 与此同时,一条消息被发送到B,同时一条消息被发送到C。由于没有可用的Threads,B 和C 都将这些邮件放入他们的邮箱中
  3. A 现在完成了对它的消息的处理并且其邮箱中没有更多消息,因此将Thread 释放回池中
  4. B 或 C 现在都需要这个 Thread。是否有任何保证将首先放在线程上?
  • Akka 如何做出这个决定?是否对ActorSystem 中的所有Actors 进行循环?
  • 此决定是否可配置?
    • 在这些情况下,我可以说优先 Actor C 在 Actor B 之前获取线程吗?

【问题讨论】:

  • AFAIK 一个 Akka Actor 不会消耗处于“等待处理消息”状态的线程。线程应该在接收到消息时被 Actor 拾取(当然吞吐量和吞吐量截止时间也可能很重要)。所以,收到一条消息 - 拿起一个线程。 AFAIK 这个决定是不可配置的。
  • 编辑了问题以澄清。两个 Actor 等待接收消息。两者都需要一个线程,但只有一个可用。哪一个会挑线?假设 dispatcher.throughput 配置为 1,dispatcher.throughput-deadline-time 配置为 0 ms。
  • 如果两个邮箱都是空的 - 踏板将由首先收到消息的 Actor(由 Dispatcher 提供)拾取。如果两个邮箱都不是空的 - Actors(由 Dispatcher 提供给他们)将根据吞吐量和吞吐量-截止时间 - 在您的示例中每个 Actor 应该处理一条消息,然后线程应该是传递给另一个 Actor(如果另一个 Actor 有消息要处理)。
  • 是的,但这并不能回答我的问题。如果两个Actors 需要Thread,因为他们的邮箱中有一条消息,但只有一个Thread 可用,那么Akka 必须决定哪个Actor 将首先获得Thread。我的问题是这个决定的依据是什么?
  • :) 如果两个 Actor 在他们的邮箱中都有一条消息,那么一个线程应该已经很忙 - 由其中一个接收消息进行消息处理(谁将首先收到消息将首先接收一个线程)。之后,Actor 应该在每个线程获取中处理 1 条消息(基于吞吐量 = 1)。

标签: akka actor


【解决方案1】:

使用 Akka 的全部原因是不必处理这类事情。您不希望(或不需要)以这样的方式优先考虑演员。内部调度程序逻辑很复杂,并且经过很好的优化,可以尽可能快地处理任务。应该通过其他方式确定优先级 - 例如路由器或优先邮箱。

现在回答您的问题:默认调度程序由阻塞队列支持 - 首先在其邮箱中收到消息的参与者将被首先选择。

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多