浅谈 akka actor

最近在学习akka,其中对于akka cluster中的remote actor 有点疑惑。经过一段时间的思考和看一些文档,以及和其他人的讨论,现在有了一个新的认识。

要想学一门技术我觉得了解它的背景是和重要的。

那么akka 出现的背景是什么呢?  肯定是现有的一些东西满足不了需求,akka actor是为了并发而设计的一种模型,传统的的做并发是通过多线程,但是多线程中的线程共享是很大的一个问题,导致并行执行不得不串行执行,这样效率大大下降,为什么会串行执行?因为线程间共享变量的问题,如果要解决这个问题,要么线程间不共享变量,也就是设置成无状态的,要么就加锁,串行执行。但是在当前的这个模型下,不共享变量解决大多数并发问题,几乎是不太可能的。    所以,akka应运而生。

akka 系统是有很多actor组成的,是一个具有层级结构的一个模型,通过把大的任务划分为若干个足够小的任务,分发到各个actor来执行,最后再进行reduce。而且actor的执行时异步的,所以可以很好解决并发的问题。

为什么akka可以异步的执行呢?因为akka中的actor是immutable也就是不可变的,如果一个actor不够那就再创建一个actor,而且actor之间是通过消息来传递信息。每个actor都有自己的mailbox用来收取消息,然后顺序的执行。收到消息后可以进行匹配,scala用的就是类型匹配,很方便。

每个ActorSystem都有一个ThreadPool来进行调度执行,也就是若干个线程执行若干个Actor。底层还是用的线程,但是akka关注的层面明显比线程高了一级。我们不用去关心线程那些问题了,所以akka 是对于线程的更高一层的抽象。

在Akka cluster中有这样一个概念就是remoting actor ,我是这样理解的,因为在集群中是很多个节点共同来完成一些大的任务。那么不同节点上的actor之间怎么去通信呢?那么就出现了remoting actor 通过在配置文件里面进行相应的配置,就可以在远程的主机上面部署一个actorsystem,当然如果你要在远程节点上面创建一些actor那也是可以的,你直接用actorOf就行了,这样远程actor和本地actor的使用上面没有很大的区别,我们在给actor发消息的时候,是给对应的ActorRef发送消息,而不是真正的actor对象,然后dispatcher 调度器会把这个消息发送到对应的actor对象的邮箱里面,其中dispatcher底层也是用线程池实现的。

以上只是个人的理解,如果有误还请大家批评指正,以免误导他人。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值