AKKA actor model 的一些思考
所属分类 akka
浏览量 729
Actor 线程间通信
CSP并发模型
Communicating Sequential Processes
独立的并发实体通过共享的通讯 Channel(管道)进行通信
Go CSP 模式 与 常见的Actor模式区别(akka Erlang 使用 Actor模式)
Actor直接通讯,CSP 通过Channel进行通讯,更松的耦合
Go channel 有容量限制 并且独立于处理GOroutine
Erlang Actor模式中的mailbox容量无限,接收进程总是被动地处理消息
得益于golang runtime优秀的调度系统,阻塞goroutine不会真正的block底层的线程
Scala 初期本身包含Actor Model,后来的版本从语言核心实现中移除,
以库的方式 ,也就是 AKKA ,包含了大量的工具,比如http的实现,stream的构建以及分布式和持久化等特性
线程是一种昂贵的资源
高效的利用线程
netty 利用很少的 worker 线程 和 boss 线程 来处理 大量的连接
Actor 特点
底层默认使用 ForkJoin线程池
java.util.concurrent.ForkJoinPool
ForkJoin线程池 能够最大化的保证每个CPU的任务队列均衡,如果出现空闲会从其他的队列偷取任务来计算
高度抽象,每个Actor作为一个处理逻辑的最小单元,接收各种消息,进行处理并将处理结果发送给另外的Actor
整个系统看起来就是各种Actor在做自己的事情并互相发消息的过程,隐藏了使用线程时的各种细节
可以将Actor看作是比线程资源更微小的处理单元
可以放心的启动成千上万个Actor,具体Actor的处理调度由自身的Dispatcher完成,不用担心过渡的消耗线程资源
全异步&高吞吐量
Local ActorSystem 将消息放到 对应 Actor的Mailbox
Remote消息的发送 依赖 NIO
尽量不要在Actor的Receive方法里边进行阻塞调用,避免降低CPU的使用率,推荐的方式就是全异步处理
可能阻塞的调用,最好通过异步的消息发送给另外的处理单元,当前Actor的Receive处理过程完成,释放线程资源,
另外的Actor在处理完成后将消息异步的发送回当前的Actor进行接下来的处理,减少线程等待的时间
弹性的,可用来构建分布式系统
Akka提供 Cluster Stream等更高层次的抽象
包含DistributedPubSub/Cluster Singleton/Cluster Distributed Data
集群级别的router,balance loader等解决方案
Actor 缺点
高层次的抽象 损失了部分性能
最小的调度级别只是线程
计算密集型的任务推荐从线程的角度去构建,而不是依赖于Actor Model
轻量级分布式任务调度系统 ,Actor Model 负责服务拓扑,事件流转,底层的密集计算,直接通过操作线程资源来实现
不方便调试
同步调用 调用堆栈
事件驱动 顺序
go channel 实例
GO多线程异步处理实例
GO箴言 goproverbs
学习GO要了解的几个特性
akka简介
akka actor demo
netty高性能之道
netty性能优化点
Netty和Akka的区别
上一篇
下一篇
一站式大数据平台StreamX
Spark 累加器 Accumulator
scala future 实例
Scala 柯里化 Currying
scala 方法和函数的区别
scala 学的走火入魔