今天开始接触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的学习记录
Akka笔记 Akka消息 文档 源代码 从 Akka记录 文档 源代码 从 Akka测试 文档 源代码 从 Akka消息传递请求和响应 文档 源代码 从arunma / AkkaMessagingRequestResponse分叉
1. **Action过滤器**(Xitrum学习笔记15 - Action过滤器.pdf):这部分内容讲述了Xitrum中的Action过滤器,这是框架提供的一个关键特性,允许开发者在处理HTTP请求之前或之后执行自定义逻辑。过滤器可以用于身份验证...
在"scala学习笔记整理"中,我们可以深入探讨以下关键知识点: 1. **基础语法**:Scala的基础语法与Java有相似之处,但也有很多独特的特点。例如,它支持变量的不可变性(immutability),使用`val`声明常量,`var`...
读书笔记:以Scala带动对异步编程webflux、akka、pulsar、gRpc等框架学习
5. Akka框架:Akka是用Scala编写的开源框架,用于构建高度可扩展、容错的应用程序,它充分利用了Scala的Actor模型。 6. Scala与Java互操作:由于Scala是运行在JVM上的,所以可以直接使用Java库,与Java代码无缝集成...
- Scala与其他技术的结合:如Spark、Akka等,学习如何在实际项目中应用Scala。 总的来说,Scala是一种强大的工具,它的设计哲学是提供一种既能充分利用面向对象编程的优势,又能发挥函数式编程优点的语言。通过学习...
本教程“scala-learn:scala学习笔记”旨在帮助初学者深入理解Scala的基础知识,同时也为有经验的程序员提供了一个复习和提升的平台。 1. **基础语法与数据类型** Scala的基础语法简洁而强大,包括变量声明(val和...
第四部分:"Scala入门及进阶-part04-Akka Actor.pdf" 专注于Scala与Akka框架的集成,Akka是用于构建高度并发、分布式和容错系统的工具。Actor模型在Akka中扮演核心角色,这部分将解释Actor如何工作,以及如何创建、...
Scala是一种多范式的编程语言,它融合了面向对象和函数式编程的概念,旨在提供一种简洁、类型安全且高性能的...通过学习,你可以熟练掌握Scala语言,应用于大数据处理、分布式计算以及构建高并发、高可用的应用系统。
分析如`Akka`、`Quasar`或`Disruptor`等并发框架的源码,可以深入理解如何在Java中构建高效的并发系统,学习其设计思想和最佳实践。 通过阅读和研究这些源码,开发者不仅可以提升对Java并发编程的理解,还能学习到...
首先,我们来看"ConcurrentProgrammingStudyNotes",这可能是一份关于Java并发编程的学习笔记。并发编程涉及线程管理、同步机制、锁、并发容器、并发工具类等内容。Java提供了丰富的API来支持并发,如`java.util....
1. **日志初始化**:通过`SignalLogger.register(log)`初始化日志记录功能,这对于诊断问题和监控系统运行状态至关重要。 2. **配置加载**:通过`SparkConf`类实例化一个新的配置对象,此对象用于加载和管理Spark...
在"scala-study"这个文件夹中,可能包含的子文件有练习代码、笔记、教程文档等,这些都是学习过程中的宝贵资料。通过这些资源,初学者可以逐步了解如何使用Scala编写Spark程序,包括如何创建SparkSession、加载数据...
1. **基本语法与类型系统**: - Scala是强类型语言,变量声明时必须指定类型,但可以使用类型推断简化编写。 - `val`用于声明不可变变量,`var`用于声明可变变量。 - 类型系统包括基本类型(如Int, Double, ...
Akka是构建可扩展并发和分布式应用程序的热门选择,因此对于想要学习如何构建可扩展系统的开发者来说,这一部分是必不可少的。 7. 另外,本书还教授如何开发领域特定语言(DSL),这对于需要高度抽象和自定义API的...
这个压缩包中的两个文件,"一、CRM笔记.md"和"二 、CRM笔记.md"(可能其中一个文件名有误,此处假设它们是不同的笔记),都是Markdown格式的文档,通常用于记录学习心得或教程。 首先,我们来深入了解一下CRM系统。...
这本书的中文完整版包含高清扫描和书签功能,使得读者可以轻松查找和学习相关内容,而且文字可选择复制,方便笔记和后续查阅。 Scala在大数据领域扮演着重要角色,主要归功于它与Apache Spark的紧密集成。Spark是一...
1. **学习Scala的原因**: Scala的出现主要是为了解决Java等传统编程语言在处理并发、复杂数据结构和模式匹配等方面的问题。它的设计目标是提高代码的可读性和可维护性,同时提供强大的类型系统和表达能力,使得...
**1. Scala简介** Scala由Martin Odersky在2003年设计,目标是创建一种既具有静态类型安全性又能支持敏捷开发的语言。它运行在Java虚拟机(JVM)上,可以无缝地与Java代码交互,同时也提供了比Java更高级的语法结构...