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 进行开发. 业务需求 实现一个简单的 “电商购物车” 需求,这里实现几个简单的业务: 获取当前购物车中的商 ...
随机推荐
- git clone远程仓库的指定分支
正常clone方式 git clone <远程仓库地址> 默认clone的是远程仓库的master分支 clone指定分支 git clone -b <分支名> <远程仓 ...
- day23 作业
day23 作业 目录 day23 作业 1.把登录与注册的密码都换成密文形式 2.文件完整性校验(考虑大文件) 3.注册功能改用json实现 4.项目的配置文件采用configparser进行解析 ...
- 纯js实现日期选取功能
平年: 2月-->28天 4,6,9,11月-->30天 1,3,5,7,8,10,12月-->31天 闰年: 2月-->29天 4,6,9,11月-->30天 1,3, ...
- windows python的多进程
最近打比赛,apply操作极慢,队友使用了线程池,用多核开辟多线程跑,加速. 在阿里平台上,都没问题. 我是win10系统+jupyter notebook 多线程那个模块运行,会显示一直运行,p.c ...
- Python爬虫学习02--pyinstaller
Python爬虫学习02--打包exe可执行程序 1.上一次做了一个爬虫爬取电子书的Python程序,然后发现可以通过pyinstaller进行打包成exe可执行程序.发现非常简单好用 2.这是上次写 ...
- Linux 通过源代码安装和编译程序
Linux源代码安装在平常工作学习中经常用到,总结下步骤↓↓↓ 第一步:#mount /dev/cdrom/mnt (挂载一个软盘) 第二步:手动安装httpd-2.4.25.tar.gz 依赖关系包 ...
- 适用于IE8浏览器的bootsarp下拉菜单(支持多选,全选)
html部分代码,引用及整体项目Github项目地址:https://github.com/CNbozi/combobox 1 <!DOCTYPE html> <html lang= ...
- 【翻译】.NET 5中的性能改进
[翻译].NET 5中的性能改进 在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进. 从.NET Core 2.0到.NET Core 2.1到.NET Core ...
- Ethical Hacking - NETWORK PENETRATION TESTING(12)
Post Connection Attacks Sophisticated attacks that can be used after connecting to the target AP. Ga ...
- 【Nginx】如何使用Nginx实现MySQL数据库的负载均衡?看完我懂了!!
写在前面 Nginx能够实现HTTP.HTTPS协议的负载均衡,也能够实现TCP协议的负载均衡.那么,问题来了,可不可以通过Nginx实现MySQL数据库的负载均衡呢?答案是:可以.接下来,就让我们一 ...