@xtccc
2016-07-24T14:20:06.000000Z
字数 761
阅读 2181
Akka
参考链接:
如果某个actor中需要处理一个运行很久的job(例如读取1个10GB的文件),或者这个actor需要等待一个较长的时间才能继续运行(例如必须等待一个外部的事件发生后才能往下走),那么我们就收此时actor发生了block。
当遇到actor block发生时,必须很小心的应对这种情况,因此当actor处于block状态时,它无法对外界的其他事件作出响应。
对于这种情况,我们通常的做法是将耗时的操作(blocking call)放在Future中,然后返回。这种做法过于简单:当app在高负荷下运作时,很容易遇到瓶颈,或者发生耗尽内存或者线程的情况。
对于blocking problem,正确的应对方式包括但不限于如下几种方法:
Future
中调用blocking call,并保证在任何时间点,这样的blocking calls的数量不会超过一个预设的上限;Future
中调用blocking call,并为其提供一个线程池,同时要保证其中的线程数不会超过一个预设的上限;
我们最好把配置线程池的任务交给Akka来完成:通过application.conf
进行配置,并创建ActorSystem实例。