actor模式是一种并发模型
线程通过消息传递进行合作,线程叫actor
mapreduce是一种典型的actor
单线程编程:程序是一个工厂,只有一个工人,干所有的事儿,
多线程编程-共享内存
干啥都要排队
多线程/分布式编程:流水线,分工明确,每个线程都是一个actor,传递消息的方式进行
什么是actor:
可以看做是一个个独立的实体,单体之间毫无关联,可以通过消息,让其他的实体做出对应的事件
基于并发机制,scala运用消息的发送接收实现高并发
actor不共享数据,避免死锁,资源争夺
actor消息发送接收
object或者class继承actor 重写act方法 调用actor的start执行actor 通过不同的方式对actor发消息 act方法中通过receive方法接收消息,并进行相应的处理 act方法执行完成之后进行相应的处理
发消息的方式
操作 | 描述 |
---|---|
! | 发送异步消息 |
!? | 发送同步消息 |
!! | 发送异步消息,返回值是Future[Any] |
- Futur表示一个异步操作的结果状态,可能还没有实际完成异步任务的结果 - Any是所有类的超类,Future[Any]的泛型是异步操作结果的类型
结合样例类发送接收消息
将消息封装在一个样例类中 通过匹配不同的样例类去执行不同的操作 actor可以返校消息给发送方,通过sender方法向当前消息发送返回消息
akka分布式应用框架
akka是java虚拟机平台上构建高并发,分布式和容错应用的工具包和运行时,akka用scala编写,同时提供scala和java开发接口,akka处理并发基于actor模型,唯一通信截止是消息传递
基本概念
akka创建一个对象,actorsystem是actor中的根acotr,一个actorsystem是一组共享通用配置(调度程序,部署,远程功能和地址),是创建或查找actor的切入点是一个扩展actorrefactory特质的抽象类
/user 所有用户创建的actor的守护actor,使用ActorSystem.actorOf创建的actor都属于他的子Actor /system 系统创建的守护actor,actor系统开始通过配置自动部署的日志监听器,或者actor /deadletter 请求挂掉actor的actor所有停止 或者不存在的actor或者不存在的actor会将请求重定向到他的邮箱中(尽力而为,即使在本地jvm也可能丢失消息) /temp 是所有创建出来,声明周期却很短的actor的守护者,例如执行actorRef.ask生成一个临时的actor和对饮的actorRef然后发送消息给其他的actor并返回一个future只要对这个future处理完成这个临时的actor就会关闭并回收资源 /remote 这个actor管理着所有的远程actor
ActorRef
actorRef是actor的引用,主要作用是支持向他所代表actor发送消息,为了使actor和外界隔离或者减轻耦合度,使用一个actorRef把数据传递到Actor邮箱中
一个actor包括
mailbox(邮箱):用于存储需要actor处理的信息或数据 behavior(行为):描述怎么处理邮箱中的信息 state(状态):actor运行时状态 supervisorStrategy(管理子actor的策略):用于描述如何管理子actor的策略,大多用于容错 children(子actor集合):当前actor所监管的子actor
Actor-Path
由于actor是以严格等级的方式创建的,所以一个由actor根据父子关系,顺序递归到root而形成的actor系统的唯一序列
一个actro可以使用多于一条路径到达
Akka http实现web应用
akka http模块组在akka-actor和akka-stream基础上实现了全http栈(服务器-客户端)的功能,并不是一个web框架,而是一个更通用的工具箱,以便于生成提供或者消费基于http的网络服务,虽然与浏览器进行互动是其功能的组成部分,但这个并不是akka http 的主要目的
开发者不需要基于akkahttp开发,而是应该使用任何合理的基础开发应用,并只有当http整合时引入akkahttp
akka http可以作为一个独立的jar引入,akka-http由两个模块组成,akka-http和akka-http-core,因为http依赖于akka-http-core,开发者不需要显示的引入后者,如果开发者只依靠底层api开发的时候可能要显示的引入一下
http服务端路由DSL
akka http在高抽象度的api提供了一套路由dsl来描述http路由和其相关处理,每一个路由可以是一或几个不同的directive层级组合而成,每一个路由则专注处理一个类型的请求