java akka actor性能_Akka系列(一):Akka简介与Actor模型
Akka是一个构建在JVM上,基于Actor模型的的并发框架,为构建伸缩性强,有弹性的响应式并发应用提高更好的平台。本文主要是个人对Akka的学习和应用中的一些理解。
Actor模型
Akka的核心就是Actor,所以不得不说Actor,Actor模型我通俗的举个例子,假定现实中的两个人,他们只知道对方的地址,他们想要交流,给对方传递信息,但是又没有手机,电话,网络之类的其他途径,所以他们之间只能用信件传递消息,很像现实中的的邮政系统,你要寄一封信,只需根据地址把信投寄到相应的信箱中,具体它是如何帮你处理送达的,你就不需要了解了,你也有可能收到收信人的回复,这相当于消息反馈。上述例子中的信件就相当于Actor中的消息,Actor与Actor之间只能通过消息通信。当然Actor模型比这要复杂的多,这里主要是简洁的阐述一下Actor模型的概念。
Akka中Actors模型
对并发模型进行了更高的抽象
异步、非阻塞、高性能的事件驱动编程模型
轻量级事件处理(1GB内存可容纳百万级别个Actor)
为什么Actor模型是一种处理并发问题的解决方案?
一开始我也不怎么理解,脑子里的一贯思维是处理并发问题就是如何保证共享数据的一致性和正确性,为什么会有保持共享数据正确性这个问题呢?无非是我们的程序是多线程的,多个线程对同一个数据进行修改,若不加同步条件,势必会造成数据污染。那么我们是不是可以转换一下思维,用单线程去处理相应的请求,但是又有人会问了,若是用单线程处理,那系统的性能又如何保证。Actor模型的出现解决了这个问题。
Actor模型概图:
从上图中我们可以看到,Actor与Actor之前只能用消息进行通信,当某一个Actor给另外一个Actor发消息,消息是有顺序的,你只需要将消息投寄的相应的邮箱,至于对方Actor怎么处理你的消息你并不知道,当然你也可等待它的回复。
JVM中的Actor有以下几个特点:
每个Actor都有对应一个邮箱
Actor是串行处理消息的
Actor中的消息是不可变的
其实只从上面一些描述来看,并不能看出Actor在处理并发问题上的有什么优势。
但我总结了两点:简化并发编程,提升程序性能
1.简化并发编程:
我们一开始说过并发导致最大的问题就是对共享数据的操作,我们在面对并发问题时多采用的是
用锁去保证共享数据的一致性,但这同样也会带来其他相关问题,比如要去考虑锁的粒度(对方法,程序块等),锁的形式(读锁,写锁等)等问题,这些问题对并发程序来说是至关重要的,但一个初写并发程序的程序员来说,往往不能掌控的很好,这无疑给程序员在编程上提高了复杂性,而且还不容易掌控,但使用Actor就不导致这些问题,首先Actor的消息特性就觉得了在与Actor通信上不会有共享数据的困扰,另外在Actor内部是串行处理消息的,同样不会对Actor内的数据造成污染,用Actor编写并发程序无疑大大降低了编码的复杂度。
2.提升程序性能:
我们之前说过既然用单线程处理,那如何保证程序的性能?首先Actor是非常轻量级的,你可以再程序中创建许多个Actor,而且Actor是异步的,那么如何利用它的这个特性呢,我们要做的就是把相应的并发事件尽可能的分割成一个个小的事件,让每个Actor去处理相应的小事件,充分去利用它异步的特点,来提升程序的性能。
其实Scala中原生的Actor并不能完成很多事,不是一套完整的并发解决方案,不适合用于生产环境,比如错误恢复,状态持久化等,所以在较新版本的Scala类库中,Akka包已经取代了原生的Actor。
Akka
那下面我们来简单说说Akka吧,Akka作为一套成熟的并发解决方案,已经被业界大量采用,尤其是在金融,游戏等领域,Akka中的容错机制,持久化,远程调用,日志等都是很重要的模块,这些内容都会在这个系列的后续文章里一一讲解。下面就以一个入门Akka程序来结束本篇文章吧。现在我们假设有一个家居机器人,我们只需要给它发送消息它便会帮我们处理相应的事情,现在我们用程序来模拟这个场景:源码链接
本示例使用Scala语言,构建工具为SBT,IDE为IntelliJ IDEA.
1.首先创建一个基于SBT的Scala工程
build.sbt配置:
name := "Example_01"
version := "1.0"
scalaVersion := "2.11.8"
val akkaVersion = "2.4.16"
libraryDependencies +=
"com.typesafe.akka" %% "akka-actor" % akkaVersion
2.我们来定义一些消息:
trait Action{
val message: String
val time: Int
}
case class TurnOnLight(time: Int) extends Action { // 开灯消息
val message = "Turn on the living room light"
}
case class BoilWater(time: Int) extends Action { // 烧水消息
val message = "Burn a pot of water"
}
3.我们利用Actor来实现一个模拟机器人:
class RobotActor extends Actor {
val log = Logging(context.system, this)
def receive: Receive = { //机器人接受指令
case t: TurnOnLight => log.info(s"${t.message} after ${t.time} hour")
case b: BoilWater => log.info(s"${b.message} after ${b.time} hour")
case _ => log.info("I can not handle this message")
}
}
4.我们去测试这个机器人:
object Example_01 extends App {
val actorSyatem = ActorSystem("robot-system")
val robotActor = actorSyatem.actorOf(Props(new RobotActor()), "robotActor") //创建一个机器人
robotActor ! TurnOnLight(1) //给机器人发送一个开灯命令
robotActor ! BoilWater(2) //给机器人发送一个烧水命令
robotActor ! "who are you" //给机器人发送一个任意命令
actorSyatem terminate ()
}
5.运行结果
[INFO] [03/19/2017 13:48:05.622] [robot-system-akka.actor.default-dispatcher-4] [akka://robot-system/user/robotActor] Turn on the living room light after 1 hour
[INFO] [03/19/2017 13:48:05.622] [robot-system-akka.actor.default-dispatcher-4] [akka://robot-system/user/robotActor] Burn a pot of water after 2 hour
[INFO] [03/19/2017 13:48:05.622] [robot-system-akka.actor.default-dispatcher-4] [akka://robot-system/user/robotActor] I can not handle this message
上面是一个非常简单的Akka例子,我们首先创建了一个机器人的Actor,然后通过向它发送不同指令,让它根据指令去做相应的事情,大家可以自己尝试去写一写相似的例子。
这篇就先到这里了,下一篇主要给大家讲讲Akka中Actor的分层结构。有兴趣的同学也可以关注我的个人博客
java akka actor性能_Akka系列(一):Akka简介与Actor模型相关推荐
- java akka actor性能_akka-http - 如何通过Akka HTTP(Java)与Akka Actor进行交互 - 堆栈内存溢出...
话题 我想通过Akka HTTP与Akka Actor进行交互 . 这个想法是要有一个系统,其中HTTP客户端调用Akka HTTP服务器方法,该方法处理对Akka Actor的请求. actor处理 ...
- 反应灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...
在我以前的文章中,我研究了一个虚拟的交易引擎,并将基于Java的阻止解决方案与基于Node.js的非阻止解决方案进行了比较. 在文章的结尾,我写道: 我怀疑在Node.js近期取得成功之后,越来越多的 ...
- akka mysql_Akka系列(七):Actor持久化之Akka persistence
这次把这部分内容提到现在写,是因为这段时间开发的项目刚好在这一块遇到了一些难点,所以准备把经验分享给大家,我们在使用Akka时,会经常遇到一些存储Actor内部状态的场景,在系统正常运行的情况下,我们 ...
- Akka系列(六):Actor解决了什么问题?
这段时间由于忙毕业前前后后的事情,拖更了很久,表示非常抱歉,回归后的第一篇文章主要是看到了Akka最新文档中写的What problems does the actor model solve?,阅读 ...
- akka的介绍_Akka笔记–演员介绍
akka的介绍 过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦. 我说管理是因为它开始很简单,一旦您开始看到性能改进,它就会变得非常有趣. 但是,当您发现没有一种简单的方法可以从子 ...
- 推荐:Java性能优化系列集锦
Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...
- Akka Actor模型的简介与Actor的创建方式
Akka Actor其具有以下特点: 系统中的所有事物都可以扮演一个Actor Actor之间完全独立 在收到消息时,Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序 Actor ...
- Akka框架——第一节:并发编程简介
本节主要内容: 1. 重要概念 2. Actor模型 3. Akka架构简介 多核处理器的出现使并发编程(Concurrent Programming)成为开发人员必备的一项技能,许多现代编程语言都致 ...
- Akka(二):使用Akka模拟yarn
1.样例 使用akka来模拟yarn集群的通信.流程图如下: 完整代码如下: MyResourceManager.scala import akka.actor.{Actor, Act ...
- 性能优化系列:每个程序员都应该知道的数字
目录 前言 正文 看这些数据的目的 1)CPU非常非常快 2)内存很快了,但是相比CPU来说还是太慢了 3)磁盘性能非常非常慢 4)磁盘顺序I/O比随机读I/O快很多 5)网络传输也是比较耗时的,基本 ...
最新文章
- 图片的赖加载(lazyLoad)
- pycharm最常用的快捷键总结
- 子域名查询DNS记录查询
- 面试题 02.01. 移除重复节点
- xp和win7安装telnet服务
- android studio日历小程序,android studio无法加载日历界面
- linux如何禁止pci设备,Linux 内核PCI去除一个设备
- Win7matlab7.0安装教程,Win7下MATLAB7.0安装教程
- 我用 Python 破解了同事的加密压缩包!
- Ubuntu16下载tomcat8
- CF 316G3 Good Substrings——广义后缀自动机
- 微信的cookie 和 session
- OKR案例——不同类型的OKR实例
- java框架面试题及答案,年薪50W
- java 三大特性_java的三大特性是什么?
- 有什么方法可以将WMV格式转换成MP4格式
- 微信公众号可以关联多少个小程序?
- Android锁屏状态下点亮屏幕并弹窗提醒
- Facebook第三方登录对接
- TM4C123G学习笔记(1)——配置Keil开发环境(TM4C123G+Keil)
热门文章
- 动力学是如何做预测的
- Atitit vscode 调试php vscode使用法 目录 1. 直接debug没反应,或者打开扩展列表	1 2. 调试配置法	1 2.1. Debug》》Add cfg php	1 2.2.
- Atiitt 图像处理的常见功能业务用途与类库与功能实现 目录 1. 常见业务场景	2 1.1. 缩略图	2 1.2. 判断图像大小分辨率要求 长度 宽度	2 1.3. 图像格式 转换,,黑白图像
- Atitit 学历的类型大总结 目录 1. 学历的分类	2 1.1. 按照组织性质,分类为立法系统 政府系统 司法系统 部落级别 企业级别商业系统 宗教系统 个人级别	2 1.2. 按照地域性质,
- Atitit 编程 序列化技术点 概念原理v2 1. 序列化:	1 2. 序列化的目的	1 2.1. 为了传输 或者存储	1 3. 应用场合	1 3.1. Form提交url	1 3.2. For
- Atitit cio之道 attilax著 2. CIO是企业组织很重要的一个官员,未来就靠信息取胜了	1 3. Cio职责	2 3.1. 企业信息化 对信息技术的利用来实现组织攻略目标	2 3
- Atitit html5 Canvas 如何自适应屏幕大小
- Atitit.java 虚拟机的构成 与指令分类 与 指令集合 以及字节码查看工具javjap
- atitit.提升软件开发的生产力关健点-------大型开发工具最关健
- paip.c++ qt 共享库dll的建立