日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SmartCode.ETL 这不是先有鸡还是蛋的问题!

發(fā)布時間:2023/12/4 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SmartCode.ETL 这不是先有鸡还是蛋的问题! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

繼國慶節(jié) SmartCode 正式版(SmartCode.Generator)發(fā)布之后,SmartCode 迎來了新的能力 SmartCode.ETL !

SmartCode 正式版從開始發(fā)布就從未說過自己僅僅是個代碼生成器,這點上從我第一次宣布SmartCode正式開源的文章就可以說明:《SmartCode 不只是代碼生成器》,這不僅僅是一句推廣語!

SmartCode.Generator

相信不少同學(xué)都用過各種代碼生成器,這里我就不做詳細介紹了,如果想體驗 SmartCode.Generator 請至?https://www.cnblogs.com/Ahoo-Wang/p/SmartCode-intro.html?配置好數(shù)據(jù)庫連接,一鍵生成解決方案。

Why SmartCode.ETL

相信不少已經(jīng)落地微服務(wù)架構(gòu)方案的同學(xué)都會遇到同樣的問題:

  • 業(yè)務(wù)方的查詢需求似乎總是跨微服務(wù)DB的

  • 領(lǐng)導(dǎo)層需要查看的報表數(shù)據(jù)總是全局的(需要聚合跨微服務(wù)DB的)

  • So SmartCode.ETL

  • 從多個微服務(wù)DB 同步業(yè)務(wù)聚合查詢數(shù)據(jù)到 all_biz DB (解決:微服務(wù)架構(gòu)一定會遇到的業(yè)務(wù)方需要跨微服務(wù)DB查詢的問題)

  • 從 all_biz DB 同步聚合分析數(shù)據(jù)到 report DB (解決:領(lǐng)導(dǎo)層查看的報表數(shù)據(jù)聚合問題)

  • How SmartCode.ETL

  • 安裝 SmartCode from dotnet-cli

    dotnet tool install --global SmartCode.CLI
  • 使用 SmartCode.Generator 生成 同步Sql表結(jié)構(gòu)腳本,以及 SmartCode.ETL 構(gòu)建配置

  • 執(zhí)行Sql同步腳本初始化表結(jié)構(gòu)

  • 使用任務(wù)調(diào)度(crontab) + SmartCode.ETL 同步分析數(shù)據(jù)

  • 通過持久化 etl_task 監(jiān)控 etl執(zhí)行情況(目前支持PostgreSql)

  • 簡單來說就是SmartCode生成SmartCode,任務(wù)調(diào)度執(zhí)行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 構(gòu)建配置

    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

    參數(shù)名說明
    ETLCodeETL任務(wù)Code,區(qū)分任務(wù)類型,唯一
    ETLRepositoryETL任務(wù)持久化倉儲,None/PG

    DataSource 參數(shù)說明

    屬性 Name:Extract,使用 ExtractDataSource 插件作為數(shù)據(jù)源

    ExtractDataSource.Paramters

    參數(shù)名說明
    DbProvider數(shù)據(jù)驅(qū)動提供者:MySql,MariaDB,PostgreSql,SqlServer,Oracle,SQLite
    ConnectionString連接字符串
    Query查詢命令,需要抽取的數(shù)據(jù)。默認會自動注入三個參數(shù) LastMaxId,LastMaxModifyTime,LastQueryTime 作為查詢條件
    PKColumn主鍵列名
    AutoIncrement是否為自增主鍵,true 自動計算抽取的最大主鍵值(MaxId)
    ModifyTime最近一次修改時間列名,設(shè)置后自定計算抽取的最大修改時間列(MaxModifyTime)

    Build.Load 參數(shù)說明

    屬性 Type:Load,使用 LoadBuildTask 插件作為構(gòu)建任務(wù)

    Build.Load.Paramters

    參數(shù)名說明
    DbProvider數(shù)據(jù)驅(qū)動提供者:MySql,MariaDB,PostgreSql,SqlServer,Oracle,SQLite
    ConnectionString連接字符串
    Table目標表名
    PreCommand執(zhí)行批量插入任務(wù)之前執(zhí)行的命令
    PostCommand執(zhí)行批量插入任務(wù)之后執(zhí)行的命令
    ColumnMapping列映射

    同步策略

    LastMaxId

    LastMaxId 即上一次抽取的數(shù)據(jù)最大Id值(第一次抽取時LastMaxId為-1),該模式使用于數(shù)據(jù)插入后不再變更的數(shù)據(jù)表。

    LastMaxModifyTime

    LastMaxModifyTime 即上一次抽取的數(shù)據(jù)最大ModifyTime值(第一次抽取時LastMaxModifyTime為1970-01-01 08:00:00),適用于插入數(shù)據(jù)后還會變更的數(shù)據(jù)表。

    并發(fā)任務(wù)同步

  • 對 Id 取模,分拆不同任務(wù),同時并發(fā)執(zhí)行

  • 大數(shù)據(jù)量同步

  • 使用 Top/Limit 限制數(shù)據(jù)抽取數(shù)量,分多次同步執(zhí)行完成整個數(shù)據(jù)同步。

  • ETL_Task 任務(wù)監(jiān)控

    性能監(jiān)控

    運行環(huán)境
  • 源抽取庫:Windows Server 2012 , 8 vCPU 16 GB + SSD + SqlServer-2014

  • 目標分析庫:CentOS-7 , 8 vCPU 16 GB + SSD + PostgreSql-11 + SmartCode

  • ETL_Task.Extract

    以下是數(shù)據(jù)抽取性能,抽取數(shù)量為 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

    以下是數(shù)據(jù)加載性能,批量插入數(shù)據(jù)量為 1434678,耗時 21817 毫秒,平均每秒插入 65759.6 條數(shù)據(jù)。

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

    目前 SmartCode.ETL 已經(jīng)落地到我們的生產(chǎn)環(huán)境了(11-01上線截至目前執(zhí)行了 26069 次同步任務(wù),暫無error日志拋出)

    PS: 雖然 SmartCode.ETL 只花了周末倆天時間完成擴展,但已經(jīng)可以滿足我們至少90%的應(yīng)用場景。這足以見得 SmartCode 擴展能力是多么令人意外了。當然SmartCode的其他能力還得后續(xù)等各位一起發(fā)掘!!!

    相關(guān)文章:

    • 如何通過本地化事件正確實現(xiàn)微服務(wù)內(nèi)部強一致性,事件總線跨微服務(wù)間最終一致性

    • SmartCode 正式開源,不只是代碼生成器!

    • SmartSql For Asp.Net Core 最佳實踐

    • SmartSql 動態(tài)代理倉儲

    • SmartCode 常見問題

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

    .NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的SmartCode.ETL 这不是先有鸡还是蛋的问题!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。