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 进行开发. 业务需求 实现一个简单的 “电商购物车” 需求,这里实现几个简单的业务: 获取当前购物车中的商 ...
随机推荐
- Dot Net Core中间件内部运行机制
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { ...
- SpringCloud组件的停更和替换说明
SpringCloud的Hoxton版本,和之前的版本相比,用新的组件替换掉了原来大部分的组件,老的组件现在处于 停更不停用 的状况. 详情见下图(× 的表示之前的组件,现在停更了的:√ 的表示新的替 ...
- node子进程(Child Process)获取硬盘分区
node child_process文档 child_process.exec(command[, options][, callback]) command <string> The ...
- EM算法理论与推导
EM算法(Expectation-maximization),又称最大期望算法,是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计(或极大后验概率估计) 从定义可知,该算法是用来估计参数的,这 ...
- Apache Hudi重磅特性解读之存量表高效迁移机制
1. 摘要 随着Apache Hudi变得越来越流行,一个挑战就是用户如何将存量的历史表迁移到Apache Hudi,Apache Hudi维护了记录级别的元数据以便提供upserts和增量拉取的核心 ...
- MySQL数据库使用报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
今天MySQL数据库,在使用的过程中一直报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement be ...
- bzoj1742[Usaco2005 nov]Grazing on the Run 边跑边吃草*&&bzoj3074[Usaco2013 Mar]The Cow Run*
bzoj1742[Usaco2005 nov]Grazing on the Run 边跑边吃草 bzoj3074[Usaco2013 Mar]The Cow Run 题意: 数轴上有n棵草,牛初始在L ...
- 面试锦囊 | HTTP 面试门路
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 Github 博客 学习清单: 零.前置知识 幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同 一.PUT ...
- [CISCN2019 华东南赛区]Double Secret
0x01 进入页面如下 提示我们寻找secret,再加上题目的提示,猜测这里有secret页面,我们尝试访问,结果如下 根据它这个话的意思,是让我们传参,然后它会给你加密,我们试一下 发现输入的1变成 ...
- Onedrive分享型网盘搭建 - OneManager
注册账号 部署OneManager 注册完账号后打开网址:https://heroku.com/deploy?template=https://github.com/qkqpttgf/OneManag ...