当我们设计并行系统时,常常会在这稳定性、可扩展性、实时性这几个特性上深究。
团队从半年前开始构建一个机遇akka的网络爬虫项目,现在项目已经上线运营。这段时间大家开始做一些细致的工作,或是性能调优,或是重构代码,从这个过程中了解到更多akka强大而简便的功能:
- 提高系统级稳定性 -> supervisor strategy
- 横向可扩展性 -> 不同routers
- 实时性 -> 不同的router和dispatcher
这个系列的文章也抄抄官方文档的基本概念,但更多的是总结我们自己项目做下来的心得体会。本文基于一个项目的个人看法,不妨写的偏激一点,虽不全面不精准,但希望帮大家绕过一些坑。
1. supervisor strategy
在akka中,每个actor都是其子actor的supervisor。当一个子actor失败时,supervisor有两种策略:
- OneForOneStrategy 只针对异常的那个子actor操作
- OneForAllStrategy 对所有子actor操作
可选的行为有Resume
Restart
Stop
Escalate
。
- 想不到特别的情形会使用OneForAllStrategy,通常父actor会对不同的子actor进行不同的管理,或者是当做router简单的转发。若是Router,可以使用Kill或者PoisonPill来做停机重启的操作。
Actor是有默认的strategy的,默认的strategy的行为为
- 当__ActorInitializationException__发生时将会停止失败的actor
- 当__ActorKilledException__发生时将会停止失败的子actor
- 当__Exception__发生时将会重启失败的子actor
- 其他类型的__Throwable__将会转发给父actor
- 默认的strategy设置是非常好用的,我们通常只是为了记录特定的日志才会稍微改动strategy。
- 我认为已知的Exception应该在子Actor中处理掉,supervisor strategy的职责于是简化为未知故障的记录和之后的重启。
可以给supervisor strategy设置譬如这样的参数 (maxNrOfRetries = 10, withinTimeRange = 1 minute)
。
来源:oschina
链接:https://my.oschina.net/u/2854291/blog/774924