5

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

 2 years ago
source link: http://edisonxu.com/2018/10/30/akka-intro.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

什么是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 分布式数据保存模块,实现最终一致性
如果您觉得文章不错,可以请我喝一杯咖啡!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK