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模型相关推荐

  1. java akka actor性能_akka-http - 如何通过Akka HTTP(Java)与Akka Actor进行交互 - 堆栈内存溢出...

    话题 我想通过Akka HTTP与Akka Actor进行交互 . 这个想法是要有一个系统,其中HTTP客户端调用Akka HTTP服务器方法,该方法处理对Akka Actor的请求. actor处理 ...

  2. 反应灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...

    在我以前的文章中,我研究了一个虚拟的交易引擎,并将基于Java的阻止解决方案与基于Node.js的非阻止解决方案进行了比较. 在文章的结尾,我写道: 我怀疑在Node.js近期取得成功之后,越来越多的 ...

  3. akka mysql_Akka系列(七):Actor持久化之Akka persistence

    这次把这部分内容提到现在写,是因为这段时间开发的项目刚好在这一块遇到了一些难点,所以准备把经验分享给大家,我们在使用Akka时,会经常遇到一些存储Actor内部状态的场景,在系统正常运行的情况下,我们 ...

  4. Akka系列(六):Actor解决了什么问题?

    这段时间由于忙毕业前前后后的事情,拖更了很久,表示非常抱歉,回归后的第一篇文章主要是看到了Akka最新文档中写的What problems does the actor model solve?,阅读 ...

  5. akka的介绍_Akka笔记–演员介绍

    akka的介绍 过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦. 我说管理是因为它开始很简单,一旦您开始看到性能改进,它就会变得非常有趣. 但是,当您发现没有一种简单的方法可以从子 ...

  6. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  7. Akka Actor模型的简介与Actor的创建方式

    Akka Actor其具有以下特点: 系统中的所有事物都可以扮演一个Actor Actor之间完全独立 在收到消息时,Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序 Actor ...

  8. Akka框架——第一节:并发编程简介

    本节主要内容: 1. 重要概念 2. Actor模型 3. Akka架构简介 多核处理器的出现使并发编程(Concurrent Programming)成为开发人员必备的一项技能,许多现代编程语言都致 ...

  9. Akka(二):使用Akka模拟yarn

    1.样例         使用akka来模拟yarn集群的通信.流程图如下: 完整代码如下: MyResourceManager.scala import akka.actor.{Actor, Act ...

  10. 性能优化系列:每个程序员都应该知道的数字

    目录 前言 正文 看这些数据的目的 1)CPU非常非常快 2)内存很快了,但是相比CPU来说还是太慢了 3)磁盘性能非常非常慢 4)磁盘顺序I/O比随机读I/O快很多 5)网络传输也是比较耗时的,基本 ...

最新文章

  1. 2019数字化趋势:未来5年政府、零售数字化程度将达80%
  2. Android SurfaceView 绘图及帧频处理方法修正
  3. xml凭证模板的一般制作
  4. 几个预编译指令的用法
  5. c/c++操作mysql数据库使用utf8总结
  6. 解决IllegalStateException: Can not perform this action after onSaveInstanceState
  7. 【BZOJ1831】[AHOI2008]逆序对(动态规划)
  8. 什么叫内部银团_MOS管和IGBT管有什么区别?
  9. android graphic(15)—fence
  10. Java Lock的使用
  11. vue 保留小数点厚一位_蓝盈莹真是一位有韵味的女人,羊羔绒还要拼上牛仔穿,真惹眼...
  12. Java从入门到精通第一版(Java基础)
  13. AutoCAD 2008中文版实用自学手册•机械设计篇
  14. Java使用Spring Boot、Maven、Spring RestTemplate集成腾讯云通信
  15. chm文档制作 java_自己动手制作chm格式开源文档
  16. html代码word,Web前端
  17. R语言入门——数据快速读取与查看(含实例代码和参数讲解)
  18. 基于蓝牙主控的智能门锁方案
  19. 搜狗翻译宝成为官方指定翻译机
  20. NS3 仿真系列资料大全

热门文章

  1. 190329每日一句
  2. Leap 使用注意事项
  3. 190117每日一句
  4. 耶鲁大学校长2018迎新演讲全文
  5. 181110每日一句
  6. unity把场景和动画生成xml
  7. Atitit arch design context软件架构设计的内容 目录 1. 考虑到架构设计原则 1 1.1. 开发效率 稳定性 可靠些等 性能 1 1.2. 简单原则则 1 1.3. 配置
  8. Atitit 企业文化建设 职称体系建设 之道 attilax著 1. 职称 1 1.1. 职称级别 prc poc 设正高级、副高级、中级、助理级 1 2. Uke职称级别 资深 高级
  9. Atitit springboot helloword 最简化 attilax总结
  10. Atitit 控制中心快速启动面板quick launcher