Akka入门系列(一):基本介绍

什么是Akka,它能干什么?

互联网系统的发展,大多数情况下都是业务倒逼的。发展过程不外乎以下几步:

  1. 最开始时,一个简单的MVC程序就可以,甚至是早期的J2EE也能得到很好的性能。
  2. 忽然某一天,系统压力大了,一些功能变得比较慢,这时会尝试去做代码重构优化,必要的地方开始使用进程内MQ以及线程池,开启异步及多线程
  3. 再往后,单台也不能满足系统的吞吐了,这时就得上集群,前面一个负载均衡,后面部署多台相同的服务器,将压力均衡到若干服务器上,甚至数据库都开始做切片。
  4. 再往后,继续优化,将一些压力大的功能单独提出来,做成一个Service,对外部提供服务,可以是REST,也可以是RPC,用这种方式来提高服务器利用率,毕竟有些业务只需要IO,而有些业务需要很强的CPU,根据实现逻辑不同,需要的物理资源也不同。而这时,简单的负载均衡也无法适用了,需要功能相对复杂的网关总线,并且各种分布式下的难点都出来了——调度、分布式容错熔断弹性扩容、分布式事务、灰度发布、压力调整等等。

可以看到,如果要开发一个分布式系统,工程师要掌握的架构知识比较多,从基本的多线程到复杂的调度、容错、熔断、弹性、扩容等等复杂系统等等,任何一个环节出问题,都可能导致系统的不稳定。而Akka简化了这一切:

  • Akka屏蔽了Java的多线程和锁,转而使用Actor模型,一般的工程师可以在不了解如何优化Java多线程编程的情况下,也能实现非常高性能的系统
  • Actor设计之初就天然满足了分布式,而且粒度较小,单机上可以跑上百万的Actor
  • Akka屏蔽了分布式集群中底层的通讯机制,对于开发者来说,只要根据业务写好Actor即可
  • Akka直接提供了分布式下高可用、弹性、动态扩容的功能,无需再次开发

AkkaScala编写,但同时提供了ScalaJava API。或许Akka你没有听过,但SparkFlink这些当下流行的大数据分布式流式系统应当有所耳闻,它们的的底层,通通都在使用AkkaScala的作者Martin Odersky,就是Akka背后的公司Lightbend(以前称为Typesafe)的创始人。Lightbend一直致力于提供基于Actor模型的分布式高性能系统,而非仅仅只有分布式框架,旗下除了Akka,还有Play(响应式Web框架)、Lagom(微服务框架)、alpkka(响应式集成中间件)。

AkkaSpring区别
Akka关注在高性能上,Spring关注于工具集的整合和统一上
Spring写出的代码(生产可用级),未必是高性能的(没说写不出高性能的),而Akka写出来的,基本上都是高性能。

利弊

好处

使用了Akka框架,你可以获得:

  • 无锁、无同异步编程和多线程编程,低成本(编码阶段)实现高性能,
  • 天然的并发系统和响应式系统,提供高吞吐和高并发服务
  • 直接获得容错系统,自由定义恢复、重置或关闭等操作
  • 简单的由单机扩展至分布式,核心业务代码几乎不用动
  • 文档齐全

并发和并行的区别

  • 并发是一个处理器利用时间切片处理多个任务
    想象电影院内的5台按摩椅,每次服务5-20分钟不等,一堆人等着坐,这个人下来那个人上。
  • 并行是多个处理器或多核的处理器同时处理不同的任务
    想象有N排按摩椅 ,每一排都可以服务一堆人。
    Akka是天然并发系统,但是并不能默认做到所有任务并行。特此澄清一下!

坏处

  • 上手难度高,学习路线陡峭
  • 中文文档少
  • 国内使用人少,遇到问题可请教或讨论的人少
  • 纯异步,调试起来比较麻烦
  • 第三方工具集少,添加进系统可能还需额外处理,缺少部分组件的整合的资料

使用方式

  • 作为一个独立程序单独启动
  • 作为一个lib集成到其他框架,如Spring里

提供的模组

Akka主要提供了如下的组件(还有一些小的省略了):

  • akka-actor_2.12 核心框架
  • akka-remote_2.12 底层通讯模块
  • akka-cluster_2.12 集群模块
  • akka-cluster-sharding_2.12 集群分片功能模块
  • akka-cluster-singleton_2.12 提供集群单例功能的模块
  • akka-cluster-tools_2.12 集群特殊功能模块
  • akka-stream_2.12 流处理及流式编程模块
  • akka-camel_2.12 基于Apache Camel的实现模块,与各种接口进行通信
  • akka-agent_2.12 处理共享变量及原子操作的模块
  • akka-http_2.12 用于构建基础http服务的模块(注意,akka http不是web框架!)
  • akka-stream-kafka_2.12 kakfa的流式接口模块
  • akka-management_2.12 分布式集群管理模块
  • akka-testkit_2.12 单元测试模块
  • akka-slf4j_2.12 实现slf4j接口的日志模块
  • akka-persistence_2.12 用于保存数据、实现CQRS架构、实现EventSourcing的模块
  • akka-distributed-data_2.12 分布式数据保存模块,实现最终一致性
本文由 EdisonXu - 徐焱飞 创作,采用 CC BY 4.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。
本文链接为http://edisonxu.com/2018/10/30/akka-intro.html
如果您觉得文章不错,可以请我喝一杯咖啡!
actor, akka, 并发, 并行