返回 登录
0

携程开源数据库访问框架Ctrip DAL

声明:本文为CSDN原创投稿文章,未经许可,禁止任何形式的转载。
作者:赫杰辉,携程技术中心框架研发部。
责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「CSDN 高级架构师群」,内有诸多知名互联网公司的大牛架构师,欢迎架构师加微信qshuguang2008申请入群,备注姓名+公司+职位。

前言

随着企业规模扩张和业务量的急剧增加,作为系统核心的数据库相关开发也会经历一个由单一团队发展为多团队;由单机扩张到集群;由单数据库发展为多数据库;由采用单一数据库产品到多种数据库产品并存的过程。伴随这一过程的是如何管理数据库扩展,如何规范数据库访问,如何保护数据库投资,如何应对访问量增加,如何预防安全问题等一系列挑战。

为了应对这些挑战,携程前CTO叶亚明先生(现首席科学家)发起了携程10X提速战略规划。作为支持10X规划的一部分,携程开发了具有自己特色的数据库访问框架Ctrip DAL。Ctrip DAL框架的最初构想是由前携程系统研发部总监陈绍明先生(Simon Chen)提出,陈绍明同时组建了开发团队并决定了该框架的路线图和重大设计决策。

简介

Ctrip DAL支持流行的分库分表操作,支持Java和C#,支持MySQL和MS SQLServer。使用该框架可以在有效保护企业已有数据库投资的同时,迅速可靠地为企业提供数据库访问层的横向扩展能力。整个框架包括代码生成器和客户端。工作模式是使用代码生成器在线生成代码,通过DAL客户端完成数据库操作。生成器具有丰富的向导指引,操作简单清晰,既可以批量生成标准DAO,也可以在方法级别定制数据库访问。客户端则可以简单地通过标准的maven方式添加依赖。

图片描述

Ctrip DAL与一般数据库框架最大的不同是从企业跨部门的角度,统一管理数据库相关资源。通过部署代码生成器,企业可以做到有效管理全公司的DAL开发团队,明确数据库归属和定制数据库访问。通过代码生成器生成的标准DAO代码与客户端配合使用,可以大幅提高工作效率,保证代码质量。解决了业内常见的伴随业务成长而带来的系统维护困难、开发效率低下、代码风格五花八门、代码质量参差不齐等痛点问题。

图片描述

顶层设计

Ctrip DAL整体上采用分层的设计思路。用户通过code gen生成的DAO为顶层调用代码;顶层代码调用公共DAO类来完成通用操作。

以Java为例,以下两个类为公共DAO:

  • DalTableDao主要为标准DAO和构建SQL的DAO服务。主要满足针对单表的操作
  • DalQueryDao主要为自定义SQL的DAO服务。可以满足复杂SQL或多表联合SQL

DalTableDao和DalQueryDao会把所有数据库操作请求打包为DalRequest并调用DalRequestExecutor来完成工作。

DalRequestExecutor会把任务分配给各种DaoTask,而DaoTask会调用DAL底层的DalClient来完成工作。

图片描述

DalRequestExecutor是DAL的系统核心,抽象了所有数据库操作通用的部分。屏蔽了不同之处,可以看作是一个微内核。

根据请求的特性分为不同类型的DalRequest。DalRequestExecutor会依据传入DalRequest完成通用的判断shard、同步/异步执行、数据分割合并的工作。

处理流程:

图片描述

图片描述

配置与扩展

为了适应不同公司的实际情况,DAL定义了丰富的扩展接口,覆盖了从数据源管理、数据库映射、连接串读取到自定义访问方式等各方面功能。同时为了方便系统监控还内置了系统状态、日志和统计模块。

以DAL Java客户端为例,DAL可以定制的组件为:

  1. DalShardingStrategy,定制数据库分片策略;
  2. DalLogger,记录DAL运行时相关信息;
  3. DalTaskFactory,细化CUD操作对应的逻辑;
  4. DalConnectionLocator,按照实际数据库标识获得连接。

DAL已经提供了每个组件的缺省实现,如果没有特殊需求,code gen缺省生成的配置可以直接使用。无需更改。如需定制,请参考缺省实现。

更多信息请参考:

Hints

除了在整个应用级别的配置,为了满足不同的数据库操作的精细化需求,DAL还提供丰富的hints来允许用户在调用级别精确调校每一次操作。由于整个DAL是通过DAO与用户交互,hints是通过独立的对象在方法一级传递给框架,比起一般的基于数据库协议,工作于JDBC一级的DAL框架简单易懂,对被执行的SQL无侵入、无污染,例如:

shard,

直接指定数据库分片id,忽略由策略计算的分片值。

List<String> ret = dao.findFieldList(cityIds, countryIds, hints.inShard(0));

masterOnly

指定操作必须使用master数据库。一般来说,CUD操作走master,但R走slave,如果希望R也走matser,可以使用这个hint。

List<String> ret = dao.findFieldList(cityIds, countryIds, hints.masterOnly());

continueOnError

当对多个entity进行CUD操作的时候,决定是否在某个更新出错的时候继续对剩下的entity进行操作。但对批处理无效。

int count = dao.insert(hints.continueOnError(), pList);

asyncExecution

在调用任何DAO的API之前设置DalHints为异步执行模式,则执行结果会放到hints里,原方法返回null或0。应用在调用结束后取得Future即可。

hints = new DalHints().asyncExecution();
dao.queryFirst(hints)
(ClientTestModel)hints.getAsyncResult().get();

更多信息请参考:

总结

Ctrip DAL历经3年不断打磨,在长期的实际使用中吸收了大量用户反馈。目前携程超过117个独立DAL团队通过代码生成器管理数据库和创建DAO。2000多个应用在使用DAL框架,占携程所有数据库应用总数超过90%。

本次开源的产品包括代码生成器、Java客户端、C#客户端和30多个主题的详细说明WIKI页面。同时还提供了编译好的发布包,参照组件的安装和使用文档,用户既可以从源代码直接编译系统,也可以直接下载现成的框架使用,无需额外工作。

通过开源自身使用DAL框架,携程希望在满足自身需求的同时,服务于广大企业,并继续为中国方兴未艾的开源运动出点力。

更多详情请参考:


2016年11月18日-20日,由CSDN重磅打造的年终技术盛会SDCC 2016中国软件开发者大会将在北京举行,大会秉承干货实料(案例)的内容原则,本次大会共设置了12大专题、近百位的演讲嘉宾,并邀请业内顶尖的CTO、架构师和技术专家,与参会嘉宾共同探讨电商架构、高可用架构、编程语言、架构师进阶、微信开发、前端、平台架构演进、基于Spark的大数据系统设计、自动化运维与容器实践、高吞吐数据库系统设计要领、移动视频直播技术等。10月21日仍是五折抢票,最低1400元,点击注册参会抢票。

评论