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 进行开发. 业务需求 实现一个简单的 “电商购物车” 需求,这里实现几个简单的业务: 获取当前购物车中的商 ...
 
随机推荐
- 【python接口自动化】01-requests请求
			
requests是模拟HTTP.https请求接口. 一.HTTP协议介绍 1.1HTTP协议特点 1.2HTTP协议组成 请求方法 主要的请求方法有:GET.POST.DELETE .PUT .HE ...
 - 007.Nginx虚拟主机
			
一 虚拟主机 1.1 虚拟主机概念 对于Nginx而言,每一个虚拟主机相当于一个在同一台服务器中却相互独立的站点,从而实现一台主机对外提供多个 web 服务,每个虚拟主机之间是独立的,互不影响的. 1 ...
 - VSCode, 当今最流行的免费开源代码编辑器,微软出品,必属精品
			
什么是VSCode? Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,并且可用于Windows,macOS和Linux.它内置了对JavaScript,T ...
 - Centos7:python 安装。yum安装软件提示 cannot find a valid baseurl for repobase7x86_64
			
方法一. 1.打开 vi /etc/sysconfig/network-scripts/ifcfg-enp4s0(每个机子都可能不一样,但格式会是“ifcfg-e...”).但内容包含: < ...
 - Python之网络编程 Socket编程
			
本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实 ...
 - [Android] keytools生成jsk文件以及获取sha1码
			
生成jks文件 进入要生的jks文件的路径,打开windows的命令提示符(CMD) keytool -genkey -alias dct -keyalg RSA -keysize 1024 -key ...
 - Ethical Hacking - Web Penetration Testing(4)
			
CODE EXECUTION VULNS Allows an attacker to execute OS commands. Windows or Linux commands. Can be us ...
 - Ethical Hacking - GAINING ACCESS(15)
			
CLIENT SIDE ATTACKS Social Engineering Gather info about the user(s). Build a strategy based on the ...
 - P1330 封锁阳光大学(洛谷)
			
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由n个点构成的无向图,n个点由m条道 ...
 - ffmpeg拉流长时间堵塞解决方式
			
由于网络堵塞或者推流端错误导致拉流端没有流数据,ffmpeg主要会堵塞两个函数,直到下次流数据的到来 avformat_open_input() 该函数是在打开流数据时,如果没有这个流的ip,http ...