所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

街头足球中的AKKA是指的什么?

发布时间:2020-04-12 08:57:56

资讯分类:akka  足球  街头  机制  模式  消息
街头足球中的AKKA是指的什么?

其实比较Akka和goroutine并不太合适,二者不是同一个层面的东西。应该比较Akka的Actor模式和Go的CSP模式。

二者都是通过消息通信的机制来避免竞态条件,但具体的抽象和实现上有些差异。

  • CSP模型里消息和Channel是主体,处理器是匿名的。
    也就是说发送方需要关心自己的消息类型以及应该写到哪个Channel,但不需要关心谁消费了它,以及有多少个消费者。Channel一般都是类型绑定的,一个Channel只写同一种类型的消息,所以CSP需要支持alt/select机制,同时监听多个Channel。Channel是同步的模式(Golang的Channel支持buffer,支持一定数量的异步),背后的逻辑是发送方非常关心消息是否被处理,CSP要保证每个消息都被正常处理了,没被处理就阻塞着。
  • Actor模型里Actor是主体,Mailbox(类似于CSP的Channel)是透明的。
    也就是说它假定发送方会关心消息发给谁消费了,但不关心消息类型以及通道。所以Mailbox是异步模式,发送者不能假定发送的消息一定被收到和处理。Actor模型必须支持强大的模式匹配机制,因为无论什么类型的消息都会通过同一个通道发送过来,需要通过模式匹配机制做分发。它背后的逻辑是现实世界本来就是异步的,不确定(non-deterministic)的,所以程序也要适应面对不确定的机制编程。自从有了并行之后,原来的确定编程思维模式已经受到了挑战,而Actor直接在模式中蕴含了这点。
从这样看来,CSP的模式比较适合Boss-Worker模式的任务分发机制,它的侵入性没那么强,可以在现有的系统中通过CSP解决某个具体的问题。它并不试图解决通信的超时容错问题,这个还是需要发起方进行处理。同时由于Channel是显式的,虽然可以通过netchan(原来Go提供的netchan机制由于过于复杂,被废弃,在讨论新的netchan)实现远程Channel,但很难做到对使用方透明。而Actor则是一种全新的抽象,使用Actor要面临整个应用架构机制和思维方式的变更。它试图要解决的问题要更广一些,比如容错,比如分布式。但Actor的问题在于以当前的调度效率,哪怕是用Goroutine这样的机制,也很难达到直接方法调用的效率。当前要像OO的『一切皆对象』一样实现一个『一切皆Actor』的语言,效率上肯定有问题。所以折中的方式是在OO的基础上,将系统的某个层面的组件抽象为Actor。

如果纯粹从调度的层面分析,正如 @邱鹏滔 的回答,Akka是在线程池基础上实现调度的,但线程是有限的,所以Akka的Actor中要避免任何阻塞操作,要么用Akka提供的异步框架,要么通过Future-callback机制,转换成回调模式。而Goroutine是用户态的线程,创建和切换成本都比较小,可以把异步的callback机制转换为同步模式,对开发比较友好些。

更详细的分析请参看我的文章: 并发之痛 Thread,Goroutine,Actor

留言与评论(共有 0 条评论)
   
验证码:
Top