继国庆节 SmartCode 正式版(SmartCode.Generator)发布之后,SmartCode 迎来了新的能力 SmartCode.ETL !

SmartCode 正式版从开始发布就从未说过自己仅仅是个代码生成器,这点上从我第一次宣布SmartCode正式开源的文章就可以说明:《SmartCode 不只是代码生成器》,这不仅仅是一句推广语!

SmartCode.Generator

相信不少同学都用过各种代码生成器,这里我就不做详细介绍了,如果想体验 SmartCode.Generator 请至 https://www.cnblogs.com/Ahoo-Wang/p/SmartCode-intro.html 配置好数据库连接,一键生成解决方案。

Why SmartCode.ETL

相信不少已经落地微服务架构方案的同学都会遇到同样的问题:

  1. 业务方的查询需求似乎总是跨微服务DB的

  2. 领导层需要查看的报表数据总是全局的(需要聚合跨微服务DB的)

So SmartCode.ETL

  1. 从多个微服务DB 同步业务聚合查询数据到 all_biz DB (解决:微服务架构一定会遇到的业务方需要跨微服务DB查询的问题)

  2. 从 all_biz DB 同步聚合分析数据到 report DB (解决:领导层查看的报表数据聚合问题)

How SmartCode.ETL

  1. 安装 SmartCode from dotnet-cli

    dotnet tool install --global SmartCode.CLI
  2. 使用 SmartCode.Generator 生成 同步Sql表结构脚本,以及 SmartCode.ETL 构建配置

  3. 执行Sql同步脚本初始化表结构

  4. 使用任务调度(crontab) + SmartCode.ETL 同步分析数据

  5. 通过持久化 etl_task 监控 etl执行情况(目前支持PostgreSql)

简单来说就是SmartCode生成SmartCode,任务调度执行SmartCode命令行。(这真的不是先有鸡还是蛋的问题.....)

SmartCode 插件概览

{  "SmartCode": {    "Version": "v1.16.15",    "Plugins": [{        "Type": "SmartCode.IDataSource,SmartCode",        "ImplType": "SmartCode.NoneDataSource,SmartCode"},{        "Type": "SmartCode.IBuildTask,SmartCode",        "ImplType": "SmartCode.App.BuildTasks.ClearBuildTask,SmartCode.App"},{        "Type": "SmartCode.IBuildTask,SmartCode",        "ImplType": "SmartCode.App.BuildTasks.ProjectBuildTask,SmartCode.App"},{        "Type": "SmartCode.IBuildTask,SmartCode",        "ImplType": "SmartCode.App.BuildTasks.MultiTemplateBuildTask,SmartCode.App"},{        "Type": "SmartCode.IBuildTask,SmartCode",        "ImplType": "SmartCode.App.BuildTasks.ProcessBuildTask,SmartCode.App"},{        "Type": "SmartCode.IOutput,SmartCode",        "ImplType": "SmartCode.App.Outputs.FileOutput,SmartCode.App"},{        "Type": "SmartCode.IDataSource,SmartCode",        "ImplType": "SmartCode.Generator.DbTableSource,SmartCode.Generator"},{        "Type": "SmartCode.IBuildTask,SmartCode",        "ImplType": "SmartCode.Generator.BuildTasks.TableBuildTask,SmartCode.Generator"},{        "Type": "SmartCode.IBuildTask,SmartCode",        "ImplType": "SmartCode.Generator.BuildTasks.SingleBuildTask,SmartCode.Generator"},{        "Type": "SmartCode.INamingConverter,SmartCode",        "ImplType": "SmartCode.Generator.TableNamingConverter,SmartCode.Generator"},{        "Type": "SmartCode.TemplateEngine.ITemplateEngine,SmartCode.TemplateEngine",        "ImplType": "SmartCode.TemplateEngine.Impl.HandlebarsTemplateEngine,SmartCode.TemplateEngine"},{        "Type": "SmartCode.TemplateEngine.ITemplateEngine,SmartCode.TemplateEngine",        "ImplType": "SmartCode.TemplateEngine.Impl.OfficialRazorTemplateEngine,SmartCode.TemplateEngine"},{        "Type": "SmartCode.Generator.IDbTypeConverter,SmartCode.Generator",        "ImplType": "SmartCode.Generator.DbTypeConverter.DefaultDbTypeConverter,SmartCode.Generator"},{        "Type": "SmartCode.IDataSource,SmartCode",        "ImplType": "SmartCode.ETL.ExtractDataSource,SmartCode.ETL"},{        "Type": "SmartCode.IBuildTask,SmartCode",        "ImplType": "SmartCode.ETL.BuildTasks.TransformBuildTask,SmartCode.ETL"},{        "Type": "SmartCode.ETL.ITransformEngine,SmartCode.ETL",        "ImplType": "SmartCode.ETL.TransformEngine.RazorTransformEngine,SmartCode.ETL"},{        "Type": "SmartCode.IBuildTask,SmartCode",        "ImplType": "SmartCode.ETL.BuildTasks.LoadBuildTask,SmartCode.ETL"},{        "Type": "SmartCode.ETL.IETLRepository,SmartCode.ETL",        "ImplType": "SmartCode.ETL.NoneETLRepository,SmartCode.ETL"},{        "Type": "SmartCode.ETL.IETLRepository,SmartCode.ETL",        "ImplType": "SmartCode.ETL.PostgreSql.PGETLRepository,SmartCode.ETL.PostgreSql",        "Paramters": {          "ConnectionString": "Server=localhost;Port=5432;User Id=postgres;Password=SmartSql; Database=smartcode_etl;"}}]}
}

ETL 构建配置

Author: Ahoo WangDataSource:  Name: Extract  Paramters:    DbProvider: SqlServer    ConnectionString: Data Source=.;Initial Catalog=SmartSqlDB;Integrated Security=True    Query: SELECT [Id],[UserName],[Status],[LastLoginTime],[CreationTime],[ModifyTime],[Deleted] FROM [T_User] With(NoLock) Where ModifyTime>@LastMaxModifyTime    PKColumn: Id    AutoIncrement: true    ModifyTime: ModifyTimeParamters:  ETLCode: SmartCode.ETL.Test  ETLRepository: PGBuild:  Transform:    Type: Transform    Paramters:      Script:   Load2PostgreSql:     Type: Load    Paramters:      DbProvider: PostgreSql      ConnectionString: Server=localhost;Port=5432;User Id=postgres;Password=SmartSql; Database=smartsql_db;    

 Table: t_user__temp      PreCommand: CREATE TABLE t_user__temp( LIKE t_user );      PostCommand: "Delete From t_user as source Where EXISTS(select * from t_user__temp temp where temp.id=source.id);Insert Into t_user  SELECT * From t_user__temp;Drop Table t_user__temp;"      ColumnMapping: [{Column: Id,Mapping: id},{Column: UserName,Mapping: user_name},{Column: Status,Mapping: status},{Column: LastLoginTime,Mapping: last_login_time},{Column: CreationTime,Mapping: creation_time},{Column: ModifyTime,Mapping: modify_time},{Column: Deleted,Mapping: deleted}]

根 Paramters

参数名 说明
ETLCode ETL任务Code,区分任务类型,唯一
ETLRepository ETL任务持久化仓储,None/PG

DataSource 参数说明

属性 Name:Extract,使用 ExtractDataSource 插件作为数据源

ExtractDataSource.Paramters

参数名 说明
DbProvider 数据驱动提供者:MySql,MariaDB,PostgreSql,SqlServer,Oracle,SQLite
ConnectionString 连接字符串
Query 查询命令,需要抽取的数据。默认会自动注入三个参数 LastMaxId,LastMaxModifyTime,LastQueryTime 作为查询条件
PKColumn 主键列名
AutoIncrement 是否为自增主键,true 自动计算抽取的最大主键值(MaxId)
ModifyTime 最近一次修改时间列名,设置后自定计算抽取的最大修改时间列(MaxModifyTime)

Build.Load 参数说明

属性 Type:Load,使用 LoadBuildTask 插件作为构建任务

Build.Load.Paramters

参数名 说明
DbProvider 数据驱动提供者:MySql,MariaDB,PostgreSql,SqlServer,Oracle,SQLite
ConnectionString 连接字符串
Table 目标表名
PreCommand 执行批量插入任务之前执行的命令
PostCommand 执行批量插入任务之后执行的命令
ColumnMapping 列映射

同步策略

LastMaxId

LastMaxId 即上一次抽取的数据最大Id值(第一次抽取时LastMaxId为-1),该模式使用于数据插入后不再变更的数据表。

LastMaxModifyTime

LastMaxModifyTime 即上一次抽取的数据最大ModifyTime值(第一次抽取时LastMaxModifyTime为1970-01-01 08:00:00),适用于插入数据后还会变更的数据表。

并发任务同步

  1. 对 Id 取模,分拆不同任务,同时并发执行

大数据量同步

  1. 使用 Top/Limit 限制数据抽取数量,分多次同步执行完成整个数据同步。

ETL_Task 任务监控

性能监控

运行环境
  1. 源抽取库:Windows Server 2012 , 8 vCPU 16 GB + SSD + SqlServer-2014

  2. 目标分析库:CentOS-7 , 8 vCPU 16 GB + SSD + PostgreSql-11 + SmartCode

ETL_Task.Extract

以下是数据抽取性能,抽取数量为 1434678,耗时 41267 毫秒。

{    "MaxId": 1755822,    "PKColumn": "Id",    "QuerySize": 1434678,    "QueryTime": "2018-11-01T11:31:53.6191084+08:00",    "QueryCommand": {        "Taken": 41267,        "Command": "Select * From T_ProductSearchLog  With(NoLock) Where Id>@LastMaxId",        "Paramters": {            "LastMaxId": -1,            "LastQueryTime": "1970-01-01T08:00:00"}}
}
ETL_Task.Load

以下是数据加载性能,批量插入数据量为 1434678,耗时 21817 毫秒,平均每秒插入 65759.6 条数据。

{    "Size": 1434678,    "Table": "t_product_search_log",    "Taken": 21817,    "PreCommand": null,    "PostCommand": null}

目前 SmartCode.ETL 已经落地到我们的生产环境了(11-01上线截至目前执行了 26069 次同步任务,暂无error日志抛出)

PS: 虽然 SmartCode.ETL 只花了周末俩天时间完成扩展,但已经可以满足我们至少90%的应用场景。这足以见得 SmartCode 扩展能力是多么令人意外了。当然SmartCode的其他能力还得后续等各位一起发掘!!!

相关文章:

  • 如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性

  • SmartCode 正式开源,不只是代码生成器!

  • SmartSql For Asp.Net Core 最佳实践

  • SmartSql 动态代理仓储

  • SmartCode 常见问题

原文地址:https://www.cnblogs.com/Ahoo-Wang/p/SmartCode-ETL.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

SmartCode.ETL 这不是先有鸡还是蛋的问题!相关推荐

  1. devc 无法编译循环语句_鸡生蛋还是蛋生鸡?详解第一个编译器是怎么来的~

    详解编译器自举原理 不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是"鸡生蛋,蛋生鸡"的问题吗? 先说最后的结论:任何一种语言的第一个编译器肯定是使用其他语言写 ...

  2. IT外企那点儿事(14): 好领导和好员工,坏领导和坏员工,鸡生蛋还是蛋生鸡?

    领导和员工,似乎天然成为互相博弈的矛盾体,他们只要单独坐在一起,比如面试,或者是One on One,都时而擦出火药味,在表面的和谐谈话气氛下,心里充满的对对方的不满和不屑,而在工作外,我们常常听到这 ...

  3. 关于程序语言的蛋生鸡 鸡生蛋问题

    今天看到酷壳上提到了程序语言的自举策略: 但是,这是一个"鸡生蛋,还是蛋生鸡"的问题,如果你需要用X语言来写一个X语言编译器的语言,你可以这样干: 用Y语言来实现X的语言解释器或编 ...

  4. UML:类图复习-鸡生蛋,蛋生鸡

    这是前一阵<高级软件工程>课堂上,老师随堂出的一道讨论题,随手贴在这里: ps: 今天是520,正好聊一些OoXx,关于爱的扯淡话题:) 题目:"鸡生蛋,蛋孵鸡",世间 ...

  5. 先有对象还是先有函数,鸡生蛋、蛋生鸡的问题。有关js里内置对象Function和Object的思考

    js里创建的函数本身作为一个实例对象都是由内置对象Function作为构造函数创造出来的,所谓var f = funciton(a){b}即等同于f = new Function(a,b). 同时js ...

  6. 管蛋还是管鸡?管鸡还是管鸡生蛋的能力?

    管蛋还是管鸡?管鸡还是管鸡生蛋的能力? 这后面其实还有说法,就是如何管一群鸡下蛋?这是根本!企业无不如此! 最近和同事们在深入讨论这个问题,基本上在原则上已经达成了一致,就是管理重点或者说是管理的主线 ...

  7. 算法还是算力?一篇微博引爆深度学习的“鸡生蛋,蛋生鸡”问题

    来源:数盟 作者: 波波 上周,由强化学习加持的AlphaZero,把DeepMind在围棋上的突破成功泛化到其他棋类游戏:8小时打败李世石版AlphaGo,4小时击败国际象棋最强AI--Stockf ...

  8. 算法还是算力?周志华微博引爆深度学习的“鸡生蛋,蛋生鸡”问题

    来源:AI科技大本营 上周,由强化学习加持的AlphaZero,把DeepMind在围棋上的突破成功泛化到其他棋类游戏:8小时打败李世石版AlphaGo,4小时击败国际象棋最强AI--Stockfis ...

  9. 2066: 计算鸡的蛋II

    城市黎明的灯火,总有光环在陨落,模仿者一个又一个,无人问津的角色,你选择去崇拜谁呢,怨恨谁呢? 题目描述 话说很久很久以前,因特奈特王国的国王因吹斯汀有一只计算鸡.为什么叫做计算鸡呢?因为这是一只会计 ...

最新文章

  1. Flask-RESTful之响应处理
  2. 从一线撤回二三线城市的程序员们,最后都怎么样了?
  3. iOS - Flutter混合开发
  4. 密码可见_教你如何批量删除微博、设置仅自己可见、仅好友可见等
  5. 100以内素数之和python123_python质数,水仙花数,简单猜拳游戏等
  6. php生成excel到服务器,yii phpexcel自动生成文件保存到服务器上
  7. Mongo DB教程及SQL与Mongo DB查询的映射
  8. pulseaudio之pacmd命令
  9. 请简述什么是spring的ioc和di_Spring的IoC与DI的理解
  10. 静态测试和动态测试有何区别
  11. ios免越狱脚本实现方案
  12. 某个程序员的工作记录
  13. ssh与ftp连接免费使用
  14. 基于云开发的校园社区小程序 微信小程序开发实战 课设作业
  15. uniapp开发的H5网页,以表单形式调起微信H5支付
  16. 苹果发布蓝牙耳机新固件,耳机Find My功能越发普及
  17. # #define 以及 # ##解释
  18. 鸿蒙系统兼容微软,效仿华为鸿蒙系统!微软放大招:新版Win10系统兼容安卓应用...
  19. 解决eclipse出现This Android SDK requires Andro...date ADT to the latest version.问题
  20. 相机和镜头选择时的一些参数

热门文章

  1. oracle11g导入错误,oracle 11g导入到10g引起的错误
  2. 框架基础:深入理解Java注解类型(@Annotation)
  3. Unbuntu 自动重启MySQL
  4. 061_Apex 异常捕捉
  5. cordova-config.xml配置应用图标
  6. excel下划线转驼峰公式
  7. UVA 11090 Going in Cycle!! 二分答案 + bellman-ford
  8. oracle中v$database视图详解
  9. ubuntu11.10 64bits机器安装flash方法
  10. 通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载...