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

Claptrap

简单来说 Claptrap = Actor + 事件溯源

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

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

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

Minon

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,您也可以发送邮件到 newbe-claptrap@googlegroups.com 来参与我们的讨论。

点击链接 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/

Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?的更多相关文章

  1. 轻松应对并发问题,Newbe.Claptrap 框架中 State 和 Event 应该如何理解?

    Newbe.Claptrap 框架中 State 和 Event 应该如何理解?最近整理了一下项目的术语表.今天就谈谈什么是 Event 和 State. Newbe.Claptrap 是一个用于轻松 ...

  2. golang gin框架中使用protocol buffers和JSON两种协议

    首先,我使用protobuf作为IDL,然后提供HTTP POST + JSON BODY的方式来发送请求. 能不能使用HTTTP POST + PB序列化后的二进制BODY呢? 做了一下尝试,非常简 ...

  3. Newbe.Claptrap 框架入门,第二步 —— 简单业务,清空购物车

    接上一篇 Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车 ,我们继续要了解一下如何使用 Newbe.Claptrap 框架开发业务.通过本篇阅读,您便可以开始尝试使用 ...

  4. 轻松应对并发问题,简易的火车票售票系统,Newbe.Claptrap 框架用例,第一步 —— 业务分析

    Newbe.Claptrap 框架非常适合于解决具有并发问题的业务系统.火车票售票系统,就是一个非常典型的场景用例. 本系列我们将逐步从业务.代码.测试和部署多方面来介绍,如何使用 Newbe.Cla ...

  5. Newbe.Claptrap 框架如何实现多级生命周期控制?

    Newbe.Claptrap 框架如何实现多级生命周期控制?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Lifetime Scope. 特别感谢 kotone 为本文提供的校对建议 ...

  6. 轻松应对并发,Newbe.Claptrap 框架入门,第四步 —— 利用 Minion,商品下单

    接上一篇 Newbe.Claptrap 框架入门,第三步 —— 定义 Claptrap,管理商品库存 ,我们继续要了解一下如何使用 Newbe.Claptrap 框架开发业务.通过本篇阅读,您便可以开 ...

  7. laravel5.5框架中视图间如何共享数据?视图间共享数据的两种方法

    laravel框架中视图间共享数据有两种,一种是用视图门面share()方法实现,另一种是用视图门面composer() 方法实现,那么,两种方法的实现究竟是怎样的呢?让我们来看一看接下来的文章内容. ...

  8. Collection框架中实现比较要实现什么接口?

    Java集合框架中需要比较大小的集合包括TreeMap.TreeSet,其中TreeMap会根据key-value对中key的大小进行排序,而TreeSet则会对集合元素进行排序. 因此TreeMap ...

  9. 十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验

    Newbe.Claptrap 项目是笔者正在构建以反应式.Actor模式和事件溯源为理论基础的一套服务端开发框架.本篇我们将来了解一下框架在水平扩展方面的能力. 前情提要 时隔许久,今日我们再次见面. ...

随机推荐

  1. statsmodels中方差分析表结果解析

    引言 通常我们在对多个变量进行统计分析的时候,结果的汇总和整理需要耗费大量的时间和精力,稍有不慎还有可能出现错误.因此在对多个变量统计分析的时候,使用自动化的脚本对结果进行整理和汇总就十分的方便了. ...

  2. @loj - 3043@「ZJOI2019」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜 ...

  3. springboot整合Mybatis(无xml)

    1.pom文件 依赖引入 <parent> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  4. sql片段提取引用

    sql片段 sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,如下: <!-- 传递pojo综合查询用户信息 --> <select id= ...

  5. Oracle调优之看懂Oracle执行计划

    @ 目录 1.文章写作前言简介 2.什么是执行计划? 3.怎么查看执行计划? 4.查看真实执行计划 5.看懂Oracle执行计划 5.1 查看explain 5.2 explain执行顺序 5.3 访 ...

  6. Nginx 如何自定义变量?

    之前的两篇文章 Nginx 变量介绍以及利用 Nginx 变量做防盗链 讲的是 Nginx 有哪些变量以及一个常见的应用.那么如此灵活的 Nginx 怎么能不支持自定义变量呢,今天的文章就来说一下自定 ...

  7. Spring事务方法上增加synchronized真的有效果吗?

    此文转载,Spring事务本身是一个非常复制的问题,再加上线程并发处理就更加要主要了,由于再开发中有很多朋友会范与下文同样的错误,因分享给大家. 前言 Spring事务的一个奇怪的问题. 朋友问了我一 ...

  8. JavaWeb网上图书商城完整项目--12.项目所需jquery函数介绍之ajax

    jquery中使用ajax发送异步请求 下面的一个案例在input输入框失去焦点的时候发送一个异步的请求: 我们来看程序的案例: 这里要强调的是返回值最好选择是json,json对应的就是对象,Jav ...

  9. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  10. SQL注入之MySQL常用的查询语句

    MySQL是一种使用很广的数据库,大部分网站都是用MySQL,所以熟悉对MySQL数据库的注入很重要. 首先来说下MySQL注入的相关知识点 在MySQL5.0版本之后,MySQL默认在数据库存放一个 ...