我有一个akka系统,其中99%的请求涉及阻止数据库调用。我想知道在单独的dispatcher \ threadpool中执行阻塞操作的系统是否有任何好处,如最佳实践中所述。
虽然akka线程将处于空闲状态,但线程池任务队列可以是溢出内存,也可以开始拒绝新任务,这是演员必须以某种方式处理的。
我知道这是一个常见的问题,但我找不到任何相关的文章或讨论。
答案 0 :(得分:0)
Akka项目非常支持Reactive Manifesto。该文档假定通过使用Akka,您还有兴趣根据Reactive Manifesto构建系统。
Reactive Manifesto的一个关键部分是系统应始终保持响应。如果您使用与主Akka路由基础结构相同的调度程序/线程池来执行阻塞数据库操作,则可能所有Akka线程都可能被数据库操作占用,并且您的系统实际上会被锁死,直到其中一个数据库为止。操作完成。对于仅执行此任务的单个JVM上的简单系统而言,这可能不是问题,但是很容易想到会导致这个问题的新功能:
另一个原因是单独的调度员可能有用。您可能希望限制对数据库的访问,以便系统不会使数据库过载。您可以将数据库调度程序设置为固定大小的线程池,并将其用作粗略但有效的方法来限制数据库请求。另一种方法是用你的演员实现一些缓冲区,但这需要大量的额外代码(尽管如果你担心由于任务太多而耗尽内存,你可能不得不这样做。)