欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AKKA学习笔记1

程序员文章站 2022-06-25 23:32:55
...
今天开始接触AKKA,先从官网上把它的两个包下了下来,发现typesafe-activator-1.0.10.zip这个包真是周到到家啊,用开源赚钱的公司,文档及周边服务确实做得好。

可惜的是,AKKA的中文文档奇缺,我找到的仅有的一篇还是基于scala的版本:
基于AKKA的后台应用开发手册
因为项目时间紧张,深入了解scala+AKKA恐怕来不及,所以我就定位在研究AKKA的java版本的研究上了。

在本地把typesafe-activator的应用服务跑了起来,结合Tutorial把第一个HelloAKKAJava.java看明白了。以下是这部分Tutorial的个人翻译,只挑重点译的,个人感觉看完这个对Actor模式算有个基本的了解了吧。

HelloAkkaJava
--------------------
Define our Messages
1. Actor可以接收任何类型的消息,包括装箱后的Java基本类型、集合对象等
2. 消息必须是不可变类型的,以免破坏Actor模型
3. 所有的消息最好都实现Serializable接口,以便以后进行节点的水平伸缩

Define our Actor
1. actor封装了状态和行为,并隔离了actor之间的数据共享
2. 每个actor一般都有一些内部状态(译者注:指的就是可以在Actor里定义非final的实例变量),由于Actor模型的保护,读取或修改内部状态完全是线程安全的

Create our Actor
1. 在AKKA中不能new一个Actor,只能使用工厂创建一个Actor的引用(ActorRef)
2. 使用ActorRef有几个优点:
  2.1 应用可以不用关心Actor的具体位置(可能在进程内、也可能在远程执行)
  2.2 应用在执行中可以动态改变Actor的位置
  2.3 使得系统可以遵照“let it crash”原则,将出错的Actor自动重启
3. ActorSystem类似于Spring的BeanFactory,作为系统的Actor容器,负责创建和管理Actor的生命周期

Tell the Actor (to do something)
1. 所有Actor的通讯过程都使用异步通讯方式
2. 每个Actor拥有一个Mailbox(实际上是一个有序消息队列),当发送者将消息放入Mailbox后,将继续执行发送者的后续动作(异步化)
3. 从同一个Actor发送出的消息是被顺序保存在接收者的Mailbox中的,不过不同的Actor发送的消息对于接收者来说是被穿插保存的
4. 当Actor没有消息消费时处于挂起状态(suspended state)

Replying to an Actor
1. 发送者通过将自己的引用传递给接收者,使得接收者可以通过这个引用(getSender方法)回复消息
2. 注意在Actor中永远不要使用this关键字作为自己的引用进行传递,而是通过getSelf方法获得自己的引用
3. 每个消息与其发送者引用永远成对出现,当Actor在处理每个新消息时其发送者引用也在随之变化
4. 某些情况下你可能需要在Actor中保存某个特定sender的引用,可以将它存储在Actor的成员变量中

Using Inbox
1. 在Actor编程模型中,任何复杂的问题都可以分解为更多的Actor作为子任务来解决
2. Inbox是为了解决没有发送者的场景(译者注:比如main方法或者Servlet中)
3. Inbox作为一个装箱Actor(actor-in-a-box)使用,他内部包含一个Actor,这个Actor可以发送消息给其它Actor并接收他们的回复
4. Inbox使用send方法发送消息,并通过receive方法接收回复消息,回复消息将放入Inbox的内部队列中,如果队列为空则receive方法将一直阻塞直到获取到回复消息
5. 阻塞会严重影响系统的性能和可扩展性,所以需要谨慎使用(译者注:receive的阻塞可以设置超时时间,当到达超时时间则会抛出一个java.util.concurrent.TimeoutException异常)
相关标签: scala akka