内容简介:互联网系统的发展,大多数情况下都是业务倒逼的。发展过程不外乎以下几步:可以看到,如果要开发一个分布式系统,工程师要掌握的架构知识比较多,从基本的多线程到复杂的调度、容错、熔断、弹性、扩容等等复杂系统等等,任何一个环节出问题,都可能导致系统的不稳定。而
互联网系统的发展,大多数情况下都是业务倒逼的。发展过程不外乎以下几步:
- 最开始时,一个简单的MVC程序就可以,甚至是早期的J2EE也能得到很好的性能。
-
忽然某一天,系统压力大了,一些功能变得比较慢,这时会尝试去做代码重构优化,必要的地方开始使用进程内MQ以及线程池,开启异步及
多线程
。 -
再往后,单台也不能满足系统的吞吐了,这时就得上集群,前面一个
负载均衡
,后面部署多台相同的服务器,将压力均衡到若干服务器上,甚至数据库都开始做切片。 -
再往后,继续优化,将一些压力大的功能单独提出来,做成一个
Service
,对外部提供服务,可以是REST,也可以是RPC,用这种方式来提高服务器利用率,毕竟有些业务只需要IO,而有些业务需要很强的CPU,根据实现逻辑不同,需要的物理资源也不同。而这时,简单的负载均衡也无法适用了,需要功能相对复杂的网关
或总线
,并且各种分布式下的难点都出来了——调度
、分布式容错
、熔断
、弹性
、扩容
、分布式事务、灰度发布、压力调整
等等。
可以看到,如果要开发一个分布式系统,工程师要掌握的架构知识比较多,从基本的多线程到复杂的调度、容错、熔断、弹性、扩容等等复杂系统等等,任何一个环节出问题,都可能导致系统的不稳定。而 Akka
简化了这一切:
-
Akka
屏蔽了 Java 的多线程和锁,转而使用Actor
模型,一般的工程师可以在不了解如何优化Java多线程编程的情况下,也能实现非常高性能的系统 -
Actor
设计之初就天然满足了分布式,而且粒度较小,单机上可以跑上百万的Actor
-
Akka
屏蔽了分布式集群中底层的通讯机制,对于开发者来说,只要根据业务写好Actor
即可 -
Akka
直接提供了分布式下高可用、弹性、动态扩容的功能,无需再次开发
Akka
由 Scala
编写,但同时提供了 Scala
和 Java
API。或许 Akka
你没有听过,但 Spark
、 Flink
这些当下流行的大数据分布式流式系统应当有所耳闻,它们的的底层,通通都在使用 Akka
。 Scala
的作者 Martin Odersky
,就是 Akka
背后的公司
Lightbend
(以前称为Typesafe)的创始人。 Lightbend
一直致力于提供基于Actor模型的分布式高性能 系统
,而非仅仅只有分布式框架,旗下除了Akka,还有 Play
(响应式Web框架)、 Lagom
(微服务框架)、 alpkka
(响应式集成中间件)。
Akka
和 Spring
区别
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 分布式数据保存模块,实现最终一致性
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
XML 在线格式化
在线 XML 格式化压缩工具
UNIX 时间戳转换
UNIX 时间戳转换