V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yuankui
V2EX  ›  程序员

Actor 模型到底怎么样?

  •  
  •   yuankui · 2019-07-01 10:17:26 +08:00 · 4593 次点击
    这是一个创建于 2002 天前的主题,其中的信息可能已经有所发展或是发生改变。
    上周末,刷技术的时候,又无意中发现一个介绍 akka,actor 模型的文章,然后又顺道把 akka 官网的吹逼看了一下,牛逼的一塌糊涂。
    但是,业界的各种新闻,关于并发,基本都是说的是 go 啊,协程啊

    那与协程比起来
    - actor 的性能到底性能?(比如就拿 scala+akka 和 go 对比?),或者 erlang 和 go 对比?
    - 能进行大规模应用吗?
    - 是否适合搭建一个微服务框架?
    - 有没有什么基于 actor 模型的分布式系统成功案例?
    23 条回复    2019-12-18 00:51:07 +08:00
    guoziyan
        2
    guoziyan  
       2019-07-01 10:40:50 +08:00
    Actor 和 CSP 可以极大的降低开发人员的心智负担
    mywaiting
        3
    mywaiting  
       2019-07-01 10:45:41 +08:00
    基于 actor 模型的分布式系统,不知道 云风 的 skynet ( lua 语言的)算不算,我就听说过一下,没有详细了解过

    关于并发这事情,现在的 golang 甚至已经是政治正确的选择,各大厂商都在拼命往上面转,不过我觉得技术无一完美,多了解多实践最重要
    FrankHB
        4
    FrankHB  
       2019-07-01 10:51:46 +08:00   ❤️ 1
    当模型就是陈年渣渣了。论文?先补 Lambda: The Ultimate XXXXX 系列刷新三观。
    razertory
        5
    razertory  
       2019-07-01 10:54:01 +08:00
    刚好之前看过一本书 《反应式设计模式》里面非常详细说了 actor 模型和一系列生态。
    glues
        6
    glues  
       2019-07-01 10:54:22 +08:00   ❤️ 1
    要了解 actor,最好的途径是看 erlang

    erlang 的成功案例就不必多说了吧
    momocraft
        7
    momocraft  
       2019-07-01 10:58:34 +08:00
    - actor 的性能到底性能
    actor 模型的重点不是并发也不是性能,虽然现实中这些方面做得也不差

    - 是否适合搭建一个微服务框架
    actor 天生是分布式,可能甚至不需要“微服务”

    - 能进行大规模应用吗 有没有什么
    能,有,但是对只看了新闻的人意义有限
    yuankui
        8
    yuankui  
    OP
       2019-07-01 11:18:07 +08:00
    @momocraft 看来问对人了

    - actor 天生是分布式,可能甚至不需要“微服务”
    那如何做跨团队协作分工呢?

    - 能,有,但是对只看了新闻的人意义有限
    开源界有标杆吗?

    - actor 模型的重点
    不是并发,不是性能,那是什么咧?
    yuankui
        9
    yuankui  
    OP
       2019-07-01 11:21:18 +08:00
    @mywaiting 我发现技术限制越来越像电影。
    无疑,大厂(电影团队)能产出很多优秀的技术(电影),但是,还是有很多小厂(小电影团队),能产出非常优秀的作品啊

    go,flutter 都是 google 节奏带的。
    zjsxwc
        10
    zjsxwc  
       2019-07-01 11:31:20 +08:00 via Android
    比线程性能高,比协程更简单
    widewing
        11
    widewing  
       2019-07-01 11:53:18 +08:00 via Android
    Apache spark 就是 akka actor 的啊
    tt67wq
        12
    tt67wq  
       2019-07-01 12:00:37 +08:00 via iPhone
    elixir erlang 啥的
    scalaer
        13
    scalaer  
       2019-07-01 12:22:43 +08:00
    当你学完了 akka cluster 之后, 会有种想法撸一个分布式计算框架, 听人说过 spark 的出现打死了一电线杆的 akka 工程师
    scalaer
        14
    scalaer  
       2019-07-01 12:23:07 +08:00
    @widewing 2.0 后就是用 netty 了
    karllynn
        15
    karllynn  
       2019-07-01 12:40:42 +08:00
    actor 没有特别好的语言 /框架,erlang 生态太差了

    csp 的话 go 很实用,干活快
    bobuick
        16
    bobuick  
       2019-07-01 12:45:27 +08:00
    csp 已 goroutine 这种形式, 工程实用性做的很极致了。 干活快才是真的好, 搞一个特别学院派纯血统的 , 最后用起来很多人无法理解也没什么球用
    FrankHB
        17
    FrankHB  
       2019-07-01 12:48:25 +08:00   ❤️ 2
    Actor 的模型为什么会被吹起来,你可以找英文维基的 History of the Actor Model 这个词条,下面有一梭子论文可以吃。

    然后你可能逐渐会发现,他们讲的和你看到的东西差不多是两码事。这是因为一开始作为 model,纯粹要的就是 model of computation,而不是体系结构研究里的 model of computer,所以性能之类的预设情形下是不管的,要关心的就是“表达能力”。

    就 model 本身来看,并发实际上是很被强调的,卖点之一就是 concurrent computation modeling。只是 actor model 并不只是要做基于其它 model 上扩充的理论,而是要完整地替代先前的理论,所以当然不只是并发,只不过把顺序的计算当作并发的特例而已。就发展过程的特色来看,还有就是强调指称语义(denotational semantics) ,不过这个你用不上。

    注意这里的并发和一般开发者理解的概念有不小距离。理论上,并发是指表达计算作用(computational effect) 的程序的非确定性组合(nondeterministic composition) ,要解决的是如何应对本质上不可预测发生的现象(例如,接受用户的输入作为一种计算上的副作用)的抽象问题。而实际开发者理解的并发经常和多任务混淆,认为并发关心的是某个计算任务在“何时”“是否同时”“如何发挥计算资源”这样的具体实现下的具体性质,还经常和并行(确定性的计算渐进行为)混淆。这种偏差导致真正意义上的 model 本身的性质并不容易直接被利用。

    顺便,上面有人提到的线程是抢占式多任务的主要实现方式,强调某些计算资源的独占性。协程是协作式多任务的一种实现。这些和并发其实没啥直接关系……硬说的话,任务调度策略本身还能扯上点关系。要回到模型,在 actor model 里扯 threading,显然就很不 pure 了。其实也有其它扩充既有设计实现多任务的替代方法(而且理论上显而易见更优越只是不足以使工业界广泛接受),只不过听起来没那么主流知道的人稍微少点而已。比如抢占式多任务用 engine ( timed-lambda ),协作式多任务可以直接用 continuation。

    至于你现在看到的具体框架的实现吹的 model,已经是跟 OOP 互相扯皮了……要知道 OOP 根本就几个的像样的 model (比较著名的也就是 Luca Cardelli 的 sigma calculus,相当地脱离实际而且睁眼说瞎话吹简单),理论上对比根本没什么意义……苦口婆心连 thread of execution 都上了地 red herring 黑了半天 OOP,站得住脚的合理理由就是它黑的 class-based OOP 在这方面确实过于弱鸡这点罢了,但实际上 OOP 在这个问题上几乎弱鸡到是个其它不建议共享可变状态的阵营的都能干翻(比如纯 FP ),并没有体现出非 actor model 才能上位这点。(而且更讽刺的是,Alan Kay 等强调的“正版” OOP 实际上用的也就是 message passing。)

    所以选择 actor model 很大程度还是 political 的问题了。
    limbo0
        18
    limbo0  
       2019-07-01 13:17:57 +08:00
    Flink, spark 都是基于 akka, 千锤百炼
    glues
        19
    glues  
       2019-07-01 13:19:18 +08:00
    @FrankHB 你这又是在哪复制粘贴过来的内容,牛头不对马嘴,不知所云
    luozic
        20
    luozic  
       2019-07-01 13:21:59 +08:00 via iPhone
    Actor 的心智模型易于证明,符合思维模式。
    FrankHB
        21
    FrankHB  
       2019-07-02 11:03:59 +08:00
    @glues 我从我 stickynotes 复制的,回的标题的问题,有什么问题?你对 LZ 的标题有什么意见找 LZ,不要随便 at 回复得牛头不对马嘴。
    glues
        22
    glues  
       2019-07-02 11:31:13 +08:00
    顺便,上面有人提到的线程是抢占式多任务的主要实现方式
    ----

    请问上面有哪个人提到你所说的这个?
    RRRSSS
        23
    RRRSSS  
       2019-12-18 00:51:07 +08:00
    actor -> Erlang
    CSP -> Go

    两者抽象对并发抽象程度不同,actor 是要明确发送者和接受者实体的,CSP 只关注通道。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1093 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:59 · PVG 02:59 · LAX 10:59 · JFK 13:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.