Akka和阻止操作

时间:2017-08-27 12:50:41

标签: asynchronous akka blocking

我有一个akka系统,其中99%的请求涉及阻止数据库调用。我想知道在单独的dispatcher \ threadpool中执行阻塞操作的系统是否有任何好处,如最佳实践中所述。

虽然akka线程将处于空闲状态,但线程池任务队列可以是溢出内存,也可以开始拒绝新任务,这是演员必须以某种方式处理的。

我知道这是一个常见的问题,但我找不到任何相关的文章或讨论。

1 个答案:

答案 0 :(得分:0)

Akka项目非常支持Reactive Manifesto。该文档假定通过使用Akka,您还有兴趣根据Reactive Manifesto构建系统。

Reactive Manifesto的一个关键部分是系统应始终保持响应。如果您使用与主Akka路由基础结构相同的调度程序/线程池来执行阻塞数据库操作,则可能所有Akka线程都可能被数据库操作占用,并且您的系统实际上会被锁死,直到其中一个数据库为止。操作完成。对于仅执行此任务的单个JVM上的简单系统而言,这可能不是问题,但是很容易想到会导致这个问题的新功能:

  1. 假设您要添加一个管理页面,该页面显示当前正在运行的数据库请求数以及等待其中一个数据库线程执行的数量。此页面应始终保持响应,即使所有数据库线程都被阻止,因此提供此页面的代码应使用不能被数据库阻止的不同调度程序。
  2. 假设您希望在多台不同的计算机上为系统添加多个JVM,以增加规模或通过一些容错来提高可靠性。这涉及通过网络发送的各种八卦消息和心跳。如果由于阻塞数据库操作而导致这些系统消息被延迟,则群集将无法正常工作。
  3. 另一个原因是单独的调度员可能有用。您可能希望限制对数据库的访问,以便系统不会使数据库过载。您可以将数据库调度程序设置为固定大小的线程池,并将其用作粗略但有效的方法来限制数据库请求。另一种方法是用你的演员实现一些缓冲区,但这需要大量的额外代码(尽管如果你担心由于任务太多而耗尽内存,你可能不得不这样做。)