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

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

    角色模型允许我们:

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

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

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

    对于对象,当方法返回时,它释放对其执行线程的控制。在这方面,actor的行为与对象非常相似,它们在完成处理当前消息时对消息作出反应并返回执行。通过这种方式,Actor实际上实现了我们想象的对象的执行:

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

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

    由于每个actor最多只能处理一条消息,因此可以保持actor的不变量而不synchronization。这种在不使用锁的情况下使用:

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

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

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

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

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

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

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

Actor优雅地处理错误情况

    由于我们不再在发送消息的Actor之间拥有共享调用堆栈,因此我们需要以不同方式处理错误情况。我们需要考虑两种错误:    

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

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

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

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

有什么讨论的内容,可以加我公众号:

猜你喜欢

转载自blog.csdn.net/woshiyexinjie/article/details/82255070