Newbe.Claptrap 框架如何实现多级生命周期控制?
Newbe.Claptrap 框架如何实现多级生命周期控制?最近整理了一下项目的术语表。今天就谈谈什么是 Claptrap Lifetime Scope。
特别感谢 kotone 为本文提供的校对建议!
Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架。如果您是首次阅读本系列文章。建议可以先从本文末尾的入门文章开始了解。
Claptrap 生命周期按照笔者的看法分为两大类进行阐述:运行时生命周期和设计时生命周期。
运行时生命周期
运行时生命周期是指 Claptrap 系统在运行过程中各个对象在内存中的生命周期行为。例如:在 Web 系统中,每个 Web 请求通常都会被分配为一个生命周期,而 Claptrap 系统也存在类似的生命周期设计。这些生命周期对于开发者进行组件扩展或者业务开发都具有一定的影响。Claptrap 框架的运行时生命周期分为:进程级(Process)、Claptrap 级和事件处理器级(Event Handler)。
进程级。被设计为进程级上生命周期的对象,属于常规意义上的单例对象。每个正在运行的 Claptrap 进程都具有自己的单例对象。典型地,例如在 Claptrap 框架中,为了提高向持久层写入事件的速度,每个持久层目标都会对应一个批量处理器(Batch Event Saver)。它们在整个进程的生命周期中只有一个实例,分别与对应的持久层一一对应,这样才能将事件进行合并写入持久层,从而提升写入性能。一般来说,被设计为进程级生命周期的对象具备以下一个或多个特点:
只需要在整个进程生命周期中运行一次的逻辑或代码。通常可以借助 Lazy 以及单例的方式实现。
整个进程生命周期中只需要单个对象。例如 Claptrap Design Store、Claptrap Options 等等。
整个进程生命周期中只能有单个对象。例如 Orleans Client。
Claptrap 级。Claptrap 级生命周期的对象会随着 Claptrap 的激活而创建,随 Claptrap 的失活而释放。这些对象通常来说与一个 Claptrap Identity 有很强的关联关系。例如,与该 Claptrap Identity 关联的 Claptrap Design、Event Saver、Event Loader、State Saver 和 State Loader 等等。
事件处理器级(Event Handler)。事件处理器级生命周期对象随着事件处理器创建而创建,随事件处理器释放而释放。与 Web 对应来说,这一级别的生命周期和 Web 请求生命周期类似。典型的,统一数据库事务的工作单元(Unit of Work)就属于这一级别。
设计时生命周期
设计时生命周期,是指 Claptrap 对应的业务对象的生命周期。这与程序是否运行无关,甚至与是否使用程序都无关。举个具体的例子,常规电商系统中的订单。一个订单的活动业务时间限界一般不会超过三到六个月。当超过这个时间限界后,订单的数据就已经不能修改。此处就这个 “三到六个月” 的时间限界称为订单的设计时生命周期。在 Claptrap 系统中,如果一个对象已经超过了其设计时生命周期,就表现为 “业务上再也不需要激活这个 Claptrap”。由此可以得到以下推论:
该 Claptrap 已经存储的事件失去了意义,删除这些事件可以腾出可用空间。
该 Claptrap 对应的业务代码不再需要维护,可以选择被移除引用或者移除代码。
所以,如果 Claptrap 的设计时生命周期越短,就更有利于减少资源的占用和代码维护成本,反之,则增加了存储成本和维护难度。故而,在设计 Claptrap 系统时,倾向于使用更短的设计时生命周期。而这个名词,也直接反应了其实完全由 “设计” 来决定。
接下来,我们列举一些常用的设计时生命周期划分法。
业务边界划分法
这是最为常见的划分法。基于领域建模的要求对业务对象进行划分。并且这些业务对象通常有固定的生命周期。就如前文的 “订单” 就是常见的按照业务边界划分生命周期的例子。在使用该方法进行划分时,只需要注意 Claptrap 满足 “大于等于最小竞争资源范围” 的基础要求就可以了。开发者可以通过 “火车售票系统” 的样例来体验这种划分法。
条件边界划分法
一般来说,基于业务边界划分法已经能够划分出合理的生命周期。但是,如果只是按照业务边界划分,可能会出现设计时生命周期为永久的对象。假如这些对象又拥有非常密集的事件操作。那么随着生成的事件量将异常多。为此,我们引入人为控制的方式来缩短设计时生命周期。这种划分是基于特定的条件划分的。因此称为条件边界划分法。而在此之中最为经典的就是采用 “时间限界” 来划分。
此处我们借由 “快速入门” 例子中的购物车对象来说明一下这种划分法。首先,购物车是和用户相关的对象,只要用户一直存在于这个系统中,那么就有可能被激活,也就是说,它的设计时生命周期是 “永久” 的。因此就无法删除相关的事件,必须永久保存这些事件来确保购物车数据的正确性。但,假如我们对于购物车在一年前所产生的的事件已经不再关心。我们就可以手动的按照年份对单个用户的购物车进行划分。同时,我们可以在相邻两个年份的购物车进行 “状态拷贝”。这样就延续前一年的状态数据,从而使用户的购物车在设计时生命周期上产生更短,而且这样也不影响业务。我们可以借助中国的一个经典传说故事《愚公移山》来理解这种基于时间的设计时生命周期划分法。故事中,愚公是凡人,虽然不能长生不老(较短的设计时生命周期),但愚公的精神(较长的设计时生命周期)却可以随着子孙后代而延续,因而可以完成移山的伟业。当每代 “愚公” 进行换代时,就发生了上文中提到的 “状态拷贝”(精神延续)。从而用较短的设计时生命周期,实现了较长的甚至永久的设计时生命周期的要求。
最后但是最重要!
最近作者正在构建以反应式、Actor模式和事件溯源为理论基础的一套服务端开发框架。希望为开发者提供能够便于开发出 “分布式”、“可水平扩展”、“可测试性高” 的应用系统 ——Newbe.Claptrap
本篇文章是该框架的一篇技术选文,属于技术构成的一部分。如果读者对该内容感兴趣,欢迎转发、评论、收藏文章以及项目。您的支持是促进项目成功的关键。
联系方式:
公开邮箱 newbe-claptrap@googlegroups.com (发送到该邮箱的内容将被公开)
您还可以查阅本系列的其他选文:
理论入门篇
实现入门篇
样例实践篇
其他番外篇
术语介绍篇
GitHub 项目地址:https://github.com/newbe36524/Newbe.Claptrap
Gitee 项目地址:https://gitee.com/yks/Newbe.Claptrap
您当前查看的是先行发布于 www.newbe.pro 上的博客文章,实际开发文档随版本而迭代。若要查看最新的开发文档,需要移步 claptrap.newbe.pro。

本文作者: newbe36524
本文链接: https://www.newbe.pro/Newbe.Claptrap/Claptrap-Lifetime-Scope/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
Newbe.Claptrap 框架如何实现多级生命周期控制?的更多相关文章
- Newbe.Claptrap 框架如何实现 Claptrap 的多样性?
Newbe.Claptrap 框架如何实现 Claptrap 的多样性?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Design 和 Claptrap Factory. 特别感谢 ...
- Newbe.Claptrap 框架如何实现在多种框架之上运行?
Newbe.Claptrap 框架如何实现在多种框架之上运行?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Box. 特别感谢 kotone 为本文提供的校对建议! Newbe.Cl ...
- Newbe.Claptrap 框架入门,第三步 —— 定义 Claptrap,管理商品库存
接上一篇 Newbe.Claptrap 框架入门,第二步 —— 简单业务,清空购物车 ,我们继续要了解一下如何使用 Newbe.Claptrap 框架开发业务.通过本篇阅读,您便可以开始学会添加一个全 ...
- 轻松应对并发,Newbe.Claptrap 框架入门,第四步 —— 利用 Minion,商品下单
接上一篇 Newbe.Claptrap 框架入门,第三步 —— 定义 Claptrap,管理商品库存 ,我们继续要了解一下如何使用 Newbe.Claptrap 框架开发业务.通过本篇阅读,您便可以开 ...
- Newbe.Claptrap 框架入门,第一步 —— 开发环境准备
Newbe.Claptrap 框架依托于一些关键性的基础组件和一些可选的辅助组件.本篇我们来介绍一下如何准备一个开发环境. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如 ...
- Newbe.Claptrap 框架入门,第二步 —— 创建项目
接上一篇 Newbe.Claptrap 框架入门,第一步 -- 开发环境准备 ,我们继续了解如何创建一个 Newbe.Claptrap 项目. Newbe.Claptrap 是一个用于轻松应对并发问题 ...
- 轻松应对并发问题,Newbe.Claptrap 框架中 State 和 Event 应该如何理解?
Newbe.Claptrap 框架中 State 和 Event 应该如何理解?最近整理了一下项目的术语表.今天就谈谈什么是 Event 和 State. Newbe.Claptrap 是一个用于轻松 ...
- 十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验
Newbe.Claptrap 项目是笔者正在构建以反应式.Actor模式和事件溯源为理论基础的一套服务端开发框架.本篇我们将来了解一下框架在水平扩展方面的能力. 前情提要 时隔许久,今日我们再次见面. ...
- Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车
让我们来实现一个简单的 “电商购物车” 需求来了解一下如何使用 Newbe.Claptrap 进行开发. 业务需求 实现一个简单的 “电商购物车” 需求,这里实现几个简单的业务: 获取当前购物车中的商 ...
随机推荐
- Django---进阶1
目录 静态文件配置 request对象方法初识 pycharm链接数据库(MySQL) django链接数据库(MySQL) Django ORM 字段的增删改查 数据的增删改查 今日作业 静态文件配 ...
- XSS与CSRF定义
一. CSRF 1. CSRF的基本概念 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通 ...
- C语言中的内存对齐问题
问题 突然收到了一个问题: #include<stdio.h> #include <math.h> struct icd { int a; //4 char b; //1 do ...
- 机器学习实战基础(八):sklearn中的数据预处理和特征工程(一)简介
1 简介 数据挖掘的五大流程: 1. 获取数据 2. 数据预处理 数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字 ...
- bzoj3892[Usaco2014 Dec]Marathon*
bzoj3892[Usaco2014 Dec]Marathon 题意: 在二维平面上有N个点,从(x1,y1)到(x2,y2)的代价为|x1-x2|+|y1-y2|.求从1号点出发,按从1到N的顺序依 ...
- bzoj2160拉拉队排练
bzoj2160拉拉队排练 题意: 给一个字符串,求最长的k个回文子串(此处回文子串长度必须为奇数)长度的乘积.字符串长度≤1000000 题解: 先用manacher预处理出第i个字符为中心的最长回 ...
- 【Nginx】如何配置Nginx日志?这是最全面的一篇了!!
写在前面 日志对于统计排错来说非常有利的.本文总结了 Nginx 日志相关的配置如 access_log. log_format.open_log_file_cache. log_not_found. ...
- js自定义方法绑定元素事件
//事件绑定封装 function addEvent(elem, type, handle){ if(elem.addEventListener){ elem.addEventListener(typ ...
- proxy是什么
普通的因特网访问是一个典型的客户机与服务器结构:用户利用计算机上的客户端程序,如浏览器发出请求,远端WWW服务器程序响应请求并提供相应的数据.而Proxy处于客户机与服务器之间,对于服务器来说,Pro ...
- [Qt2D绘图]-01Qt2D绘图基本绘制和填充
Qt的文档位置为 Paint System 大纲: 简介 先看一个小例子 基本的绘制和填充 使用画笔(Qpen) 使用画刷(QBrush) ...