SmartCode.ETL 這不是先有雞還是蛋的問題!

来源:https://www.cnblogs.com/Ahoo-Wang/archive/2018/11/06/SmartCode-ETL.html
-Advertisement-
Play Games

繼國慶節 SmartCode 正式版(SmartCode.Generator)發佈之後,SmartCode 迎來了新的能力 SmartCode.ETL ! SmartCode 正式版從開始發佈就從未說過自己僅僅是個代碼生成器,這點上從我第一次宣佈SmartCode正式開源的文章就可以說明: "《Sm ...


繼國慶節 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 Wang
DataSource:
  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: ModifyTime
Paramters:
  ETLCode: SmartCode.ETL.Test
  ETLRepository: PG
Build:
  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 任務監控

SmartCode.ETL

性能監控

運行環境
  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的其他能力還得後續等各位一起發掘!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 拉模式和推模式 拉模式 1、數據更新頻率低,則大多數請求是無效的 2、線上用戶量多,則服務端的查詢負載高 3、定時輪詢拉取,實時性低 推模式 1、僅在數據更新時才需要推送 2、需要維護大量的線上長連接 3、數據更新後可以立即推送 基於webSocket推送 1、瀏覽器支持的socket編程,輕鬆維持 ...
  • 最近在學習netty的時候,發現裡面用到了監聽器模式,感覺非常實用,以前看設計模式的時候只是看,並沒有用上。其實這是一個非常重要並實用的設計模式,在很多框架裡面都用到了。 netty裡面的應用: 回調函數 為什麼先提到回調函數呢?因為回調函數是理解監聽器、觀察者模式的關鍵。剛畢業的時候老大也經常和我 ...
  • 應該是完整的?我也不清楚,還在看 鏈接: https://pan.baidu.com/s/14qcaUhyxl6xb4fo6-xxMKQ 提取碼: 3i6z 送給愛學習的人 ...
  • 線程池對於性能優化無處不在 1.樓主在平時產品開發過程中所遇到的性能問題,特別是最近特別流行的微服務架構、 web - java - 底層數據源(python亦或者opensatck),對於這種前後臺分離的場景 無時無刻會存在對於業務場景需要對同一數據源進行百次,千次的重覆調用過程、 性能方面就會出 ...
  • Lua表類似HashMap Lua的表本質其實是個類似HashMap的東西,其元素是很多的Key Value對,如果嘗試訪問了一個表中並不存在的元素時,就會觸發Lua的一套查找機制,也是憑藉這個機制來模擬了類似“繼承”的行為 舉例說明: 輸出為nil的原因很簡單,tempTable中並沒有membe ...
  • 1.迭代器的遍歷原理,首先,我們先來聊一下迭代器的迭代原理,這裡以集合為例。通常迭代器在集合中可以作為遍歷集合中元素的一種方式,如下代碼,通過集合的list.Iterator()方法得到迭代器,然後進入while迴圈,執行it.hasNext()語句判斷集合中下一個對象是否存在,存在進迴圈。執行it ...
  • 歡迎加入python學習交流群:646293950,一起交流學習,共同進步。 ...
  • 一.byte和int相互轉換的方法 java程式或Android程式的socket數據傳輸,都是通過byte數組,但是int類型是4個byte組成的,如何把一個整形int轉換成byte數組,同時如何把一個長度為4的byte數組轉換為int類型。 /** * int到byte[] * @param i ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...