Akka(0):聊聊对Akka的初步了解和想法
前一段时间一直沉浸在函数式编程模式里,主要目的之一是掌握一套安全可靠的并发程序编程方法(concurrent programming),最终通过开源项目FunDA实现了单机多核CPU上程序的并行运算。但是,虽然通过在终端实现并行运算能充分利用多核CPU的计算能力把数据处理运算分布到前台可以大大减轻后台服务器的压力,提高系统整体效率,对现今大数据普遍盛行的系统计算要求还是远远不足的,只有通过硬件平行拓展(scale-out)形成机群并在之上实现分布式运算才能正真符合新环境对软件程序的要求。那么,下一个阶段目标应该是分布式运算了。众所周知,Akka应该是目前最著名和通用的分布式软件开发工具了,加上是scala语言的开源项目。由于Akka已经是一个在现实中被大量使用的成熟软件工具,网上各方面的参考资料比较丰富,感觉应该是一个比较理想的选择。
花了几天时间研究了一下Akka官方网站上的资料,先在这里把了解的情况在下面做个小结:
Akka程序是由多个Actor组成的。它的工作原理是把一项大运算分割成许多小任务然后把这些任务托付给多个Actor去运算。Actor不单可以在当前JVM中运行,也可以跨JVM在任何机器上运行,这基本上就是Akka程序实现分布式运算的关键了。当然,这也有赖于Akka提供的包括监管、监视各种Actor角色,各式运算管理策略和方式包括容错机制、内置线程管理、远程运行管理(remoting)等,以及一套分布式的消息系统来协调、控制整体运算的安全进行。
Actor是Akka系统中的最小运算单元。每个Actor只容许单一线程,这样来说Actor就是一种更细小单位的线程。Akka的编程模式和其内置的线程管理功能使用户能比较自然地实现多线程并发编程。Actor的主要功能就是在单一线程里运算维护它的内部状态,那么它的内部状态肯定是可变的(mutable state),但因为每个Actor都是独立的单一线程运算单元,加上运算是消息驱动的(message-driven),只容许线性流程,Actor之间运算结果互不影响,所以从Akka整体上来讲Actor又好像是纯函数不可变性的(pure immutable)。Actor的内部状态(internal state)与函数式编程不可变集合(immutable collection)的元素差不多,都是包嵌在一个类型内,即F[A] >>> Actor[A]从类型款式来讲很相像,那么我们可否对Actor进行函数组合(functional composition),然后实现函数式编程模式的Akka编程呢?应该是不可能的,因为我们无法对Actor的运算结果进行固定。一是我们无法防止Actor的运算产生副作用,再就是Actor的运算结果是无法预料的,例如它可能把结果发送给任何其它Actor,这样对同样的输入就可以产生不同的结果。我们可以把Actor视作不纯函数(impure function),对同样的输入可能会产生不同的输出结果,如此就无法把对Actor的编程归类为函数式编程了,但Actor编程的确是一种有别于其它编程模式、别具风格的编程模式,而且Akka还有一套领域特定语言DSL,是一种独立的编程模式,即Actor编程模式了。这是一种需要掌握的崭新编程模式。
Akka程序具备了以下的优点:
1、Responsive 快速响应
以最快时间对用户请求进行回复(响应)
2、Resilient 高容错性
可以通过对Actor的:
复制(replication)、
封闭(containment)、
分离(isolation)、
托管(delegation)来应对解决Actor产生的任何程度的错误和异常
3、Elastic 可伸缩性
通过提升计算机配置的垂直扩展(scale-up)、添加网络中计算机数量的水平扩展(scale-out)等系统拓展能力
实现在任何负载压力情况下的快速响应
4、Message-driven 消息驱动
- 异步通信(asynchronous communication)
- 松散耦合(loosely coupled)
- 位置透明的Actor定位方式
- 负载均衡(load management)、流程控制(flow control)、back-pressure
上面所述特点之一的消息驱动模式中提供了位置透明的Actor定位方式,可以简单的通过设定消息接收方地址来实现程序的分布式运算。这点倒是很有趣。
除了普通功能的Actor之外,Akka还提供了几种具有特殊功能的Actor,包括:路由(routingActer)、有限状态机(FSMActor)、持久式(persistenceActor)。其中persistenceActor很有吸引力,它可以通过CQRS模式帮助实现新的数据库操作模式ES(Event-Sourcing)。CQRS模式的基本原理是对数据库的读和写进行分离操作,目的是提高大数据类型网络应用程序的响应。当然,从另一个方面来讲,Event-Sourcing作为一种新的数据库操作模式,应该能解决任何数据库应用软件所普遍面对的数据重演功能缺失,以及数据库使用压力等问题。
初步打算下面的主攻方向是基于persistenceActor的ES模式数据库应用和基于Actor-http的Microservice工具库。当然,希望通过各种努力最终实现让那些不精通Akka的朋友们能方便的编写Actor模式的分布式应用程序。这可能会涉及到对Akka功能的再组合,搭建新的更高层次的抽象框架、提供API等。当然,这些还是需要对Akka进行详细的研究学习后才能有所定论。
刚好,发现在网上的基于scala的Akka讨论示范并不多,那在下面一段时间的讨论里我们就开始从头学习Akka吧。。。
Akka(0):聊聊对Akka的初步了解和想法的更多相关文章
- Akka系列(十):Akka集群之Akka Cluster
前言........... 上一篇文章我们讲了Akka Remote,理解了Akka中的远程通信,其实Akka Cluster可以看成Akka Remote的扩展,由原来的两点变成由多点组成的通信网络 ...
- AKKA(一)认知AKKA
Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用.它已经成功运用在电信行业.系统几乎不会宕机(高可用性 99.999999 ...
- android蓝牙4.0(BLE)开发之ibeacon初步
一个april beacon里携带的信息如下 ? 1 <code class=" hljs ">0201061AFF4C0002159069BDB88C11416BAC ...
- Akka源码分析-Akka Typed
对不起,akka typed 我是不准备进行源码分析的,首先这个库的API还没有release,所以会may change,也就意味着其概念和设计包括API都会修改,基本就没有再深入分析源码的意义了. ...
- vue2.0开发聊天程序(八) 初步完成
项目地址 服务器源码地址:https://github.com/ermu592275254/chat-socket 网页源码地址:https://github.com/ermu592275254/ch ...
- Akka.NET v1.0 已发布,支持Mono
Akka.NET 是Java/Scala 流行框架Akka的一个 .NET 开源移植.可用于构建高并发,分布式和容错事件驱动的应用在 .NET 和 Mono 平台之上.Akka.NET 经过一年多的努 ...
- Scala零基础教学【102-111】Akka 实战-深入解析
第102讲:通过案例解析Akka中的Actor运行机制以及Actor的生命周期 Actor是构建akka程序的核心基石,akka中actor提供了构建可伸缩的,容错的,分布式的应用程序的基本抽象, a ...
- Akka.net路径里的user
因为经常买双色球,嫌每次对彩票号麻烦,于是休息的时候做了个双色球兑奖的小程序,做完了发现业务还挺复杂的,于是改DDD重做设计,拆分服务,各种折腾...,不过这和本随笔没多大关系,等差不多了再总结一下, ...
- Spark如何使用Akka实现进程、节点通信的简明介绍
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
随机推荐
- JS高级- OOP-ES5
1. OOP 面向对象三大特点: 封装,继承,多态 封装: 问题: 构造函数可重用代码和结构定义,但无法节约内存 为什么: 放在构造函数内的方法定义,每new一次,都会反复创建副本——浪费内存 解决: ...
- windows10安装ubuntu on windows10
安装向导 https://msdn.microsoft.com/en-us/commandline/wsl/install_guide
- 852. Peak Index in a Mountain Array
class Solution { public: int peakIndexInMountainArray(vector<int>& A) { return max_element ...
- 2018.12.17 ural1132 Square Root(二次剩余)
传送门 MD写一道二次剩余的板题差点写自闭了. 我用的是cipollacipollacipolla算法. 利用的是欧拉准则来找寻一个二次非剩余类来求根. 注意这题有两个等根和模数为2的情况. 代码: ...
- 2018.12.17 bzoj4802: 欧拉函数(Pollard-rho)
传送门 Pollard−rhoPollard-rhoPollard−rho模板题. 题意简述:求ϕ(n),n≤1e18\phi(n),n\le 1e18ϕ(n),n≤1e18 先把nnn用Pollar ...
- oracle创建视图(view)
视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词. 视图是存储在数 ...
- [转]MySQL源码:Range和Ref优化的成本评估
MySQL源码:Range和Ref优化的成本评估 原文链接:http://www.orczhou.com/index.php/2012/12/mysql-source-code-optimizer-r ...
- 模板引擎(smarty)知识点总结四
/* smarty 引入对象 */ require_once 'libs/Smarty.class.php'; require 'MySmarty.class.php'; $msma = ne ...
- 单片机CPU
MCS-51的CPU由 运算部件和 控制部件构成 运算部件 包括ALU.位处理器.累加器A.暂存器.程序状态寄存器PSW.寄存器B 累加器A 一个8位累加器,A的进位标志Cy同时是位处理器的一位累加器 ...
- mui学习
改变状态栏的颜色 <meta name="apple-mobile-web-app-capable" content="yes"> <me ...