Akka适用于分布式系统《five》译

    正如上一篇所描述的那样,通用编程实践并不能恰当地知足要求现代系统的需求。谢天谢地,咱们不须要把咱们所知道的所有都废弃了。相反,角色模型以必定原则方式解决这些缺点,让系统可以以更好的方式与咱们的心智模式相匹配。角色模型抽象容许您从通讯方面考虑您的代码,而不是像大型组织中的人之间发生的交换。html

    角色模型容许咱们:编程

  • 强制封装而无需使用锁
  • 使用协做实体的模型对信号作出反应,改变状态,并相互发送信号以推进整个应用程序向前发展
  • 不要担忧与咱们的观念不匹配的执行机制。

消息传递的使用避免锁定和阻塞

    Actor不是调用方法,而是互相发送消息。发送消息不会将执行线程从发送方传输到目标,Actor能够发送消息并继续而不会阻止。所以,它能够在相同的时间内完成更多。缓存

    对于对象,当方法返回时,它释放对其执行线程的控制。在这方面,actor的行为与对象很是类似,它们在完成处理当前消息时对消息做出反应并返回执行。经过这种方式,Actor实际上实现了咱们想象的对象的执行:网络

    传递消息和调用方法之间的一个重要区别是消息没有返回值。经过发送消息,Actor将工做委托给另外一个Actor。正如咱们在回调的错觉中看到的那样,若是它指望返回值,则发送方须要阻止或在同一线程上执行其余Actor的工做。相反,接收者将结果传递给回复消息。ide

    咱们模型中须要的第二个关键变化是恢复封装(reinstate encapsulation)。Actor对消息做出反应,就像对象“响应”它们上调用的方法同样。不一样之处在于,不是多个线程“响应”到咱们的Actor中而且对内部状态和不变量形成严重破坏,Actor独立于消息的发送者执行,而且他们一次一个地顺序响应传入的消息。当每一个Actor按顺序处理发送给它的消息时,不一样的Actor会相互同时工做,这样Actor系统就能够同时处理硬件支持的消息。ui

    因为每一个actor最多只能处理一条消息,所以能够保持actor的不变量而不synchronization。这种在不使用锁的状况下使用:spa

    总之,这是Actor收到消息时发生的事情:操作系统

  • Actor将消息添加到队列的末尾。
  • 若是Actor未安排执行,则将其标记为准备执行。
  • 调度程序接受Actor并开始执行它。
  • Actor从队列前面挑选消息。
  • Actor修改内部状态,将消息发送给其余Actor。
  • Actor是不按期的。

    为了实现这种行为,Actor有:线程

  • 邮箱(邮件结束的队列)
  • 行为(Actor的状态,内部变量等)
  • 消息(表示信号的数据片断,相似于方法调用及其参数)
  • 执行环境(须要具备消息响应并调用其消息处理代码的actor的机制)
  • 地址(稍后会详细介绍)

    消息进入Actor邮箱。该角色的行为描述了角色如何响应消息(好比发送更多消息和/或更改状态)。执行环境将线程池从新设置为彻底透明地驱动全部这些操做。htm

    这是一个很是简单的模型,它解决了之前列举的问题:

  • 经过将执行与信号解耦来保留封装(方法调用传输执行会,消息传递不会)。
  • 不须要锁。修改actor的内部状态只能经过消息进行,消息一次处理一次,在尝试保持不变量时消除竞争。
  • 在任何地方都没有使用锁,而且不会阻止发件人。能够在十几个线程上有效地安排数百万演员,充分发挥现代CPU的潜力。任务受权是演员的天然操做模式。
  • 参与者的状态是本地的而不是共享的,更改和数据经过消息传播,这些消息映射到现代内存层次结构实际工做的方式。在许多状况下,这意味着只传输包含消息中数据的缓存行,同时保持本地状态和数据缓存在原始核心。相同的模型彻底映射到远程通讯,其中状态保存在机器的RAM中,而且变化/数据做为分组在网络上传播。

Actor优雅地处理错误状况

    因为咱们再也不在发送消息的Actor之间拥有共享调用堆栈,所以咱们须要以不一样方式处理错误状况。咱们须要考虑两种错误:    

  • 第一种状况是,因为任务中的错误(一般是某个验证问题,如不存在的用户ID),目标参与者上的委托任务失败。在这种状况下,由目标参与者封装的服务是完整的,只有任务自己是错误的。服务参与者应该给发件人回复一条消息,并给出错误状况。这里没有什么特别的地方,错误是域的一部分,所以成为普通消息。
  • 第二种状况是服务自己遇到内部故障。Akka强调全部的演员都被组织成一个树状的层次结构,也就是说,一个创造另外一个演员的演员变成了那个新演员的父亲。这很是相似于操做系统如何将进程组织到树中。就像进程同样,当参与者失败时,它的父参与者会获得通知,它能够对失败作出反应。此外,若是父角色被中止,那么它的全部子元素也会被递归地中止。这项服务被称为监督。

    主管(父母)能够决定在某些类型的故障中从新启动其子actor,或者彻底阻止其余人。孩子们永远不会沉默地死去(除了进入无限循环以外),他们要么失败,要么他们的父母能够对错误做出反应,或者他们被中止(在这种状况下,有关方会自动获得通知)。老是有一个负责任的实体来管理一个演员:它的父母。从外部看不到从新启动:协做actor能够在目标actor从新启动时继续发送消息。

    下一章,让咱们简要介绍一下Akka提供的功能。

 

原文:https://doc.akka.io/docs/akka/current/guide/actors-intro.html

有什么讨论的内容,能够加我公众号:

相关文章
相关标签/搜索