1.缘起:
假设我们的订单报表系统,需要能够实时地统计当天的已成交订单的报表。最直观的解决方案就是,当每次接收到查询报表的请求时,就从存储设备读取当天所有已成交的订单,然后再进行分析计算给出结果。这是可行的,而且得到的结果也是非常实时的。
但是,这种方式无疑也是非常低效的,因为我们报表数据的统计过程可能相当复杂,而且,可能是成千上万的用户在同时查询报表数据。在这种情况下,将给存储服务器和业务服务器都造成巨大的压力。
现在我们假设需求能够放宽一点――报表数据不用非常实时,可以允许最大为1分钟的延迟。对于绝大多数业务系统来说,报表数据延迟在1分钟以内,都是能够接受的,所以这个假设并不过分,下面我们基于这个假设来继续讨论。
在报表数据能够允许最大延迟为1分钟许可条件下,我们就可以做缓存的动作了。因为如果要求是完全实时的,那么缓存报表数据能做到的程度就非常的有限,但是有了这一分钟的延迟允许,缓存就可以完全地发挥出它的优势了。
现在,我们可以每隔1分钟从存储设备读取上一分钟已成交的所有注单,这就是所谓的“增量数据”,然后将其做报表分析计算,然后将计算的结果“累加”到之前的“累积的报表数据”上。这样,当用户每次来请求报表数据时,只要将当前累积的报表数据直接返回就可以了。因为我们是每隔1分钟对增量进行累加一次,所以,用户看到的报表数据的延迟最多不会超过1分钟。
上述这个例子很好地体现了“增量缓存”的核心思想,上面提到的“累积的报表数据”实际上就是一个增量缓存的典型实例。关于增量缓存,我们会在下一节进行详细介绍。本节我们将先介绍增量缓存会用到的一个基础组件――增量自动获取器
ESBasic.ObjectManagement.Increasing.IIncreaseAutoRetriever。
现在,我们将注意力集中到上述例子中关于数据增量获取的这个焦点上:
(1)增量可能需要从多个数据源获取。比如,不同类型的订单可能存放在不同的数据库中。
(2)如何体现以一天为单位进行轮转?如果要查看的是周报表,那么就需要将一周作为一轮(Round)。
(3)如果是一天为一轮,那么当经过每天的00:00:00时,增量获取器该如何完结前一天的增量,并切换到新的一天?
这些都是IIncreaseAutoRetriever要解决的问题,而IIncreaseAutoRetriever很好的解决了这些问题,并以一种非常简单易用的接口提供给使用者。
增量自动获取器的形象示意图如下:
2.适用场合:
在满足以下这些条件时,你可以使用IIncreaseAutoRetriever:
(1)需要定时从数据源获取新的增量数据。
(2)数据源可能不只一个。
(3)需要支持“轮”(Round)的概念。在Round切换时,需要能够准确识别增量断点。
(4)增量数据有某个字段是递增的。
3.设计思想与实现
在正式解析IIncreaseAutoRetriever的源码之前,我们先将其会涉及到的一些重要概念说明一下。
首先,数据源可能是多个,所以我们需要为每个数据源设置一个唯一标志(我们称之为Source Token),这标志的类型可能是一个整数,也可能是一个字符串或枚举类型等等。那么,我们可以将数据源标志的类型抽象为一个泛型参数。
其次,上面我们提到Round,即表示增量完成累积的一个完整周期,比如,可能是一天、一周或一月,这取决于你系统的需求。同样的,我们需要每个Round都有唯一的标志(我们称之为Round
ID),以将当前Round同历史的Round区分开来。Round
ID的类型也是根据系统的需求来定的,所以,我们也将Round ID的类型抽象为一个泛型参数。
再次,我们将缘起部分例子中的一分钟的时间间隔称为一个增量阶段Phase。所以,一个Round是由N个Phase构成的,而且,N通常是个比较大的值。
最后,由于获取增量数据的时候,我们需要依据数据的某个key来进行判断,哪些数据是在刚过去的一个Phase中新加入进来的,这就要求key是递增的,这对从数据源中提取增量会带来极大的便利。比如,可以使用订单的产生时间作为key,如果订单的编号是递增的,也可以使用订单编号作为key。在数据源是数据库的情况下,最好是使用主键作为key,当然,这个时候主键必须是递增的。
IIncreaseAutoRetriever
增量自动获取器会每隔一段时间就从各个数据源(TSourceToken)获取上一阶段的增量数据(TObject),然后触发事件将得到的增量数据发布出去。
下面,我们来看IIncreaseAutoRetriever接口定义:
分享到:
相关推荐
本人将 zhuweisky博主的博客整理成了PDF文件,以便于脱机浏览,没有经过博主的同意就这么做 实在是不好意思^-^ 现将其资料免费下载 以示对博主的尊重 源博客地址:...
.NET设计规范:约定、惯用法与模式,在.net环境下进行开发设计的经典之作,权威指导.
LiteGo:「迷你」的Android异步并发类库LiteGo是一款基于Java语言的「异步并发类库」,它的核心是一枚「迷你」并发器,它可以自由地设置同一时段的最大「并发」数量,等待「排队」线程数量,还可以设置「排队策略」...
新版根据.NET Framework 3.0和3.5的新特性做了全面更新,主要关注的是直接影响框架可编程能力的设计问题。遵守这些规范对于使用.NET Framework创建高质量的应用程序至关重要。 本书提供配套光盘,内含Designing ...
NET应用架构设计原则、模式与实践.pdf NET应用架构设计原则、模式与实践.pdf
灵活易用的工作流组件、数据字典管理组件、在线表单设计组件、丰富的报表统计组件、即时通讯(IM)组件、邮件中心组件、微信开发相关组件、任务调度组件、自动升级组件、多语言模块,各种常用的商业控件,强大的代码...
新版根据.NET Framework 3.0和3.5的新特性做了全面更新,主要关注的是直接影响框架可编程能力的设计问题。遵守这些规范对于使用.NET Framework创建高质量的应用程序至关重要。 本书提供配套光盘,内含Designing ...
2.2.4 分层架构原则 25 2.3 小结 27 第3章 命名规范 28 3.1 大小写约定 29 3.1.1 标识符的大小写规则 29 3.1.2 首字母缩写词的大小写 31 3.1.3 复合词和常用术语的大小写 33 3.1.4 是否区分大小写 ...
自己写的ado.net类库,已实现有关数据库操作的各种方法,子类只需提供数据库连接,即可调用,极大了实现了代码复用.这是我针对实际开发中经常需要重复开发数据库操作而提出的解决方案. 注意,该类实现的是关于sqlserver...
博文地址:http://blog.csdn.net/csnd_ayo/article/details/72457190
这里收集一些著名的 C/C++ 开发库、SDK、类库、可复用类与结构代码 等信息,列举它们的介绍、参考和网站链接,为各位 C/C++ 程序员和爱好者提供检索和查阅类库的方便。 下面收集的 C/C++ 类库介绍整理来源于文章:...
自从.NET推出以来,他已使用.NET帮助很多行业的用户开发了体现其商业理念的软件产品.Xin Chen是.NET和EAI方面的专家,他与Microsoft和Accenture等多家技术领先的公司合作,为它们的客户提供了优秀的解决方案....
此外,还可以创建一个新类库实现软件复用。 • 第十章介绍.NET下的数据库支持,阐述了ADO.NET的基本概念和结构,并通过示例詊细介绍C#下Web Service数据库访问的方法。 • 第十一章将在以前的基础上介绍一个...
这些规范历经.NET框架三个版本的长期开发,凝聚了数千名开发人员的经验和智慧。微软的各开发组正在使用这些规范开发下一代影响世界的软件产品。 第1章 概述 1 1.1 精心设计的框架所具备的品质 2 1.1.1 精心...
HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署即可! 服务器自定义开发二之客户端脚本回发 Web开发: 使用URL重写WEB主题切换 如何在Asp.Net1.1中实现页面模板(所谓的...
Android应用源码开发Demo,主要用于毕业设计学习。
逻辑与计算机设计基础,课后答案,很全很详细,每章节的答案都全面
本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别...
Android应用源码开发Demo,主要用于毕业设计学习。