21

Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?

 3 years ago
source link: http://www.cnblogs.com/newbe36524/p/13286019.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?最近整理了一下项目的术语表。今天就谈谈为什么起了 Claptrap 和 Minion 两个名字。

Claptrap

简单来说 Claptrap = Actor事件溯源

aABbMfI.gif

Claptrap 是本框架定义的一种特殊 Actor。除了上文中提到 Actor 两种特性之外,Claptrap 还被定义为具有以下特性:

状态由事件进行控制。Actor 的状态在 Actor 内部进行维护。Claptrap 同样也是如此,不过改变 Claptrap 的状态除了在 Actor 之外,还限定其只能通过事件进行改变。这就将事件溯源模式与 Actor 模式进行了结合。通过事件溯源模式保证了 Actor 状态的正确性和可追溯性。这些改变 Claptrap 状态的事件是由 Claptrap 自身产生的。事件产生的原因可以是外部的调用也可以是 Claptrap 内部的类触发器机制产生的。

Claptrap 是 newbe36524 曾经玩过的一款老游戏中的经典角色。 点击此处了解

Minon

322yeen.gif

Minion 是本框架定义的一种特殊 Claptrap 。是在 Claptrap 基础上做出的调整。其具备以下特性:

从对应的 Claptrap 读取事件。与 Claptrap 相同,Minion 的状态也由事件进行控制。不同的是,Minion 就像其字面意思一样,总是从对应的 Claptrap 处获取事件,从而改变自身的状态。因此,其可以异步的处理 Claptrap 产生事件之后的后续操作。

Minion 一词出自 newbe36524 玩的一款运气游戏 《炉石传说》 ,其中 “随从” 在英文版中的描述即为 “minion”。

Claptrap 故事化描述

以下是关于 Claptrap 的故事化描述,用于辅助理解。不必太过在意。

Claptrap 是一种结构简单、功能简单的机器人。虽然它能够完成各种各样的任务,但是它却有一些限制。

Claptrap 是一种单线程的机器人,它每次只能进行一个任务。如果你想要交给它多个任务的话,它会按照事情安排的先后顺序逐个处理。

Claptrap 工作的时候大概的过程是这样的。当他接受到一个任务时,他会先考虑这个事情是否是他能够百分之百完成的。如果这件事情他能够百分之百完成,那么那就将这件事情写入到他的备忘录当中,然后完成这件事情。然后接下来处理下一个事情。

每天早上一起来,Claptrap 做的第一件事情就是找回迷失的自我。找回昨天那个棒棒的自己。首先它会尝试看看有没有昨天的靓照,如果有的话,它将复刻昨天的样貌。接下来,从手中的备忘录当中阅读昨天拍照之后发生的种种事情,逐渐的恢复自己的记忆。这样就成功的找回的自己。

Claptrap 是一种标准化的机器人。它们都产出于 Claptrap 工厂的生产线。工厂会按照 Claptrap 设计图使用标准化的组件来组装一个 Claptrap 机器人。这些必要的组件主要包括了:内存、手持型备忘录、多功能任务处理器和内存打印机。

内存。Claptrap 配备有一个定制化大小的内存,用于保存当前整机的状态数据。由于内存数据的断电易失性,所以假如 Claptrap 断电了,那么内存中的数据也就丢失了。

多功能任务处理器。基于成本的考虑,每个 Claptrap 配备的多功能任务处理器都是为了特种的任务定制过的。例如:专门用于消防的 Claptrap ,在它们的多功能任务处理器中基本上包含的都是和消防有关的功能。但是它就无法处理家政相关的任务。

手持型备忘录。Claptrap 在做每件任务之前都会用手持型备忘录记录任务相关的一切细节,来确保任务的每个细节都准确无误。

内存打印机。可以将内存当中的数据打印成一份可以持久化保存的物理格式,在实际生产中用的比较多的是 DNA 记忆体。由于内存数据的断电易失性,所以重启之后内存当中的数据只能通过备忘录记录来逐个找回。但由于备忘录数据有可能很大,这样恢复起来会比较的缓慢。有了内存打印机的帮助,便可以将某一时刻的内存状态完全打印出来,这样在重启恢复时将加快内存数据恢复的速度。

Minon 故事化描述

以下是关于 Minion 的故事化描述,用于辅助理解。不必太过在意。

对于较为复杂的任务来说单个 Claptrap 完成起来会比较困难。因此,在设计此类 Claptrap 的时候会按照需求给这个 Claptrap 追加几个小弟来协助它完成手头的任务。这些小弟被称为 Minion 。Minion 的本质也是一台 Claptrap 机器人,但是它们相对于完整版的 Claptrap 来说,减少了手持型备忘录这个设备。这是源于其工作方式和 Claptrap 略有不同的原因。

Minion 只能通过协同 Claptrap 来完成任务,它们不能决定是否要做某个任务。所以记录任务详细信息的手持型备忘录只要有 Claptrap 持有就可以了。

当 Claptrap 完成一件任务时,它会通知他的 Minion 们关于此次任务的细节。这样 Minion 便可以同步的获得任务内容,并借此来更新自己的记忆。以下我们来通过一个例子来解释这种工作模式。

假设我们现在在某个小区投放了一台 Claptrap 机器人来作为门卫机器人。它的工作职责包括有以下这些:

  1. 负责对门房的车辆进行检查和放行
  2. 负责对付来自路人的各种询问

我们现在知道,Claptrap 机器人在工作的时候只能同时处理一件事情。也就是说,假如它正在为某台车辆进行检查和放行,那么它就无法处理路人的询问。同样地,假如它正在接受路人的询问,那么它就无法处理车辆的检查和放行。这么做效率并不高。因此,我们为这台 Claptrap 增加一台 Minion 来协助其完成接受路人询问的任务。

具体的工作方式是这样的:每天,Claptrap 都会对小区周围的情况进行检查并且将具体的信息全部都记录在手持型备忘录当中。并且它会将这些任务的细节通知给它的 Minion 。于是 Minion 就也知道了关于这个小区的所有细节,因此它就能够轻松的应付路人的询问了。

通过这样的合作,就能使得 Claptrap 更加高效的专注于车辆的检查和放行,而路人的询问则交给 Minion 来处理就可以了。

不过,对于一些细节还需要进行补充解释以便读者理解:

为什么不直接增加一台新的 Claptrap 来直接处理路人的询问呢?一台新的 Claptrap 意味着一个新的主体,它能够独立的完成任务,这样会增加管理的成本。但是如果只是新增一台 Minion ,它则可以由它所属的 Claptrap 来负责管理,相较而言更容易管理。当然为了增加一点代入感,还可以这么理解:Minion 相比于常规的 Claptrap 缺少了手持型备忘录这个设备。这个设备的成本占总硬件成本的 99%。减少成本来完成相同的任务,何乐不为呢?

Claptrap 将任务细节通知给 Minion 的成本会不会很高?不会的。Claptrap 和 Minion 一般都是团伙作业,随着现在无线网络技术的不断改善,这种成本将会越来越小。5G 赋能,未来可期。

现在,我们在额外考虑一个场景:假如物业经理希望 Claptrap 每天定时汇报小区的车辆出入情况。同样,为了增加代入感,我们不妨假设这个小区非常忙碌,一天 24 小时都有车辆进进出出。因此如果让它拿出时间来汇报车辆出入情况的话,由于 Claptrap 的单线程特性,那么很可能小区门口就堵成长安街了。

有了前面的经验,我们同样可以为这台 Claptrap 配备一台新的 Minion 来处理向物业经理汇报的这个任务。因为 Claptrap 在进行车辆出去检查的时候会将相关的细节通知给 Minion。所以 Minion 也就知道了关于今日车辆出入情况的所有细节,做出报表,那就是分分钟的事情。

我们再来增加一个场景:我们需要普查一下人口数量。那么只需要在小区门卫 Claptrap 检查出入人员时,对人员的信息进行记录。同样的,我们添加一台 Minion 来专门汇总那些核的数据,并且将上级部门。正巧,上级部门也是通过一台 Claptrap 机器人来接收下级的数据汇报,并且正好其也有一台 Minion 用来汇总下级汇报上来的数据,并且汇报给它的上级。就这样 Claptrap1 -> Minion1 -> Claptrap2 -> Minion2 -> Claptrap3 …… 一层一层的向上。于是我们就完成了全国乃至全球的数据汇总。

因此,我们可以总结一下。有了 Minion 的加持,可以为 Claptrap 更好的完成至少三类事情:

  1. 协助分担原有的查询类任务
  2. 协助完成一些统计、通知等等可以异步处理的任务
  3. 协助完成和其他 Claptrap 的协同来完成规模更大的任务

最后但是最重要!

最近作者正在构建以 反应式Actor模式事件溯源 为理论基础的一套服务端开发框架。希望为开发者提供能够便于开发出 “分布式”、“可水平扩展”、“可测试性高” 的应用系统 ——Newbe.Claptrap

本篇文章是该框架的一篇技术选文,属于技术构成的一部分。如果读者对该内容感兴趣,欢迎转发、评论、收藏文章以及项目。您的支持是促进项目成功的关键。

如果你对该项目感兴趣,你可以通过 github issues 提交您的看法。

如果您无法正常访问 github issue,您也可以发送邮件到 [email protected] 来参与我们的讨论。

点击链接 QQ 交流【Newbe.Claptrap】: https://jq.qq.com/?_wv=1027&k=5uJGXf5

您还可以查阅本系列的其他选文:

  1. Newbe.Claptrap - 一套以 “事件溯源” 和 “Actor 模式” 作为基本理论的服务端开发框架
  2. 十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验
  3. 谈反应式编程在服务端中的应用,数据库操作优化,从 20 秒到 0.5 秒
  4. 谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert
  5. docker-mcr 助您全速下载 dotnet 镜像
  6. Newbe.Claptrap 项目周报 1 - 还没轮影,先用轮跑
  7. Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车
  8. Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?

GitHub 项目地址: https://github.com/newbe36524/Newbe.Claptrap

Gitee 项目地址: https://gitee.com/yks/Newbe.Claptrap

开发文档: http://claptrap.newbe.pro/

AvaAjyV.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK