akka进阶(1)

杀马特。学长 韩版系。学妹 提交于 2020-05-06 02:09:11

当我们设计并行系统时,常常会在这稳定性、可扩展性、实时性这几个特性上深究。

团队从半年前开始构建一个机遇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)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!