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异常)
可惜的是,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异常)