Bỏ qua để đến nội dung

Airbyte — Data ingestion trong kiến trúc DataValue

Một Data Platform không bắt đầu từ dashboard, cũng không bắt đầu từ AI. Nó bắt đầu từ một bài toán tưởng như đơn giản:

Làm thế nào đưa dữ liệu từ các hệ thống vận hành vào Data Platform một cách ổn định, có kiểm soát và mở rộng được?

Một doanh nghiệp thường vận hành ERP, CRM, eCommerce, hệ thống sản xuất, ứng dụng nội bộ, database và hàng chục dịch vụ SaaS. Dữ liệu nằm khắp nơi. Nếu mỗi lần cần dữ liệu, đội phát triển lại viết một chương trình riêng để gọi API, truy vấn database, dò dữ liệu mới, xử lý lỗi rồi ghi vào kho — doanh nghiệp sẽ nhanh chóng sở hữu hàng chục, hàng trăm pipeline tự phát khó bảo trì. Đây chính là bài toán Airbyte được sinh ra để giải quyết.

Airbyte là một nền tảng Data Integration & Data Replication mã nguồn mở. Nhiệm vụ cốt lõi có thể nói rất gọn: đưa dữ liệu từ Source đến Destination một cách có hệ thống.

flowchart LR
  ERP["ERP"] & CRM["CRM"] & PG["PostgreSQL"] & MY["MySQL"] & SAAS["SaaS Apps"] & API["APIs"] & FILE["Files"] --> AB["🔌 AIRBYTE"] --> DP["Data Platform"]

Airbyte gọi phía cung cấp dữ liệu là Source, nơi nhận dữ liệu là Destination, và một cấu hình kết nối giữa hai đầu là một Connection.

Source (nguồn)

Nơi cung cấp dữ liệu: Odoo, PostgreSQL, MySQL, API, SaaS, file…

Destination (đích)

Nơi nhận dữ liệu: kho phân tích như ClickHouse, warehouse, data lake.

Connection (kết nối)

Cấu hình nối Source → Destination: chọn stream, chế độ đồng bộ, lịch chạy.

Airbyte cung cấp một hệ sinh thái connector lớn cho database, data warehouse, data lake, SaaS và nhiều hệ thống khác — đồng thời hỗ trợ xây custom connector khi chưa có sẵn. Điều này giúp đội Data tập trung vào dữ liệu và business logic, thay vì liên tục viết lại “plumbing code” để di chuyển dữ liệu.

Vì sao doanh nghiệp cần một Data Ingestion Platform?

Phần tiêu đề “Vì sao doanh nghiệp cần một Data Ingestion Platform?”

Hãy lấy ví dụ gần với dự án DataValue. Odoo Community 19 đang giữ: Customer, Product, Sales Order, Sales Order Line, Purchase Order, Inventory, Supplier, Invoice, Payment, bút toán kế toán… Business muốn dashboard phân tích doanh thu theo khách hàng, sản phẩm và thời gian.

Cách đơn giản nhất là cho BI cắm thẳng vào database của Odoo:

flowchart LR
  ODOO["Odoo PostgreSQL"] --> BI["📊 BI"]

Nhưng khi hệ thống lớn lên, cách này sinh vấn đề: BI truy vấn trực tiếp operational database → tải phân tích ảnh hưởng vận hành; dữ liệu lịch sử, transformation và analytical model ngày càng phức tạp; và khi xuất hiện thêm AI/ML hay ứng dụng cần dữ liệu, mỗi consumer lại phải kết nối về hệ thống nguồn.

Kiến trúc tốt hơn là tách hai thế giới:

flowchart TB
  subgraph OP["⚙️ OPERATIONAL"]
    ODOO["Odoo Community 19"]
  end
  subgraph AN["📈 ANALYTICAL"]
    CH["ClickHouse"] --> DBT["dbt"] --> CUBE["Cube"]
    CUBE --> BI["BI"] & AI["AI"] & APP["Apps"]
  end
  ODOO -->|"Airbyte"| CH

Airbyte chính là lớp tách Operational Data khỏi Analytical Data.

Source Connector — Airbyte hiểu cách lấy dữ liệu từ đâu

Phần tiêu đề “Source Connector — Airbyte hiểu cách lấy dữ liệu từ đâu”

Giá trị lớn nhất của Airbyte về mặt kiến trúc là Connector Architecture. Thay vì Data Engineer phải tự xây toàn bộ logic connect → authenticate → read → paginate → checkpoint → retry → handle schema → write, Airbyte đưa phần lớn logic đó vào các connector dùng lại được.

flowchart LR
  PG["PostgreSQL"] & MY["MySQL"] & API["API"] & SAAS["SaaS"] & FILE["Files"] & ERP["ERP / CRM"] --> AB["🔌 AIRBYTE"]

Airbyte mô tả catalog của mình với hơn 600 sources và destinations, đồng thời hỗ trợ xây custom connector khi cần. Đây là một lợi ích kiến trúc rất lớn:

Source system có thể thay đổi, nhưng Data Platform không cần thay đổi theo.

Destination Connector — đưa dữ liệu đến đúng Data Platform

Phần tiêu đề “Destination Connector — đưa dữ liệu đến đúng Data Platform”

Phía bên kia là Destination. Airbyte có thể đưa dữ liệu vào nhiều loại analytical storage khác nhau — data warehouse, data lake, analytical database…

flowchart LR
  SRC["Source"] --> AB["🔌 Airbyte"]
  AB --> DW["Data Warehouse"]
  AB --> DL["Data Lake"]
  AB --> ADB["Analytical Database"]

Điều này tạo ra một abstraction layer quan trọng: Source và Destination không cần biết chi tiết triển khai của nhau. Trong DataValue, lựa chọn là:

flowchart LR
  ODOO["Odoo Community 19"] --> AB["🔌 Airbyte"] --> CH["🗄️ ClickHouse"]

ClickHouse trở thành analytical foundation; Airbyte chịu trách nhiệm đưa dữ liệu đến đó.

Full Refresh — lấy lại toàn bộ dữ liệu

Phần tiêu đề “Full Refresh — lấy lại toàn bộ dữ liệu”

Một khái niệm cơ bản của data replication là Full Refresh: Airbyte đọc lại toàn bộ dataset và đồng bộ sang destination.

flowchart TB
  A["ODOO · Customers · 100.000 dòng"] -->|"Full Refresh"| B["🔌 Airbyte"] --> C["ClickHouse · Customers · 100.000 dòng"]

Full Refresh dễ hiểu, dễ vận hành. Phù hợp với: bảng nhỏ; master / reference data; dữ liệu ít thay đổi; giai đoạn phát triển ban đầu; khi cần rebuild lại dataset. Nhưng nếu Sales Order có hàng chục triệu dòng thì đọc lại toàn bộ mỗi lần là không hiệu quả — đó là lý do cần Incremental Sync.

Incremental Sync — chỉ lấy phần dữ liệu mới

Phần tiêu đề “Incremental Sync — chỉ lấy phần dữ liệu mới”

Giả sử hôm qua ClickHouse đã có 10 triệu Sales Order Line; hôm nay Odoo phát sinh thêm 20.000 dòng. Không có lý do gì phải đọc lại toàn bộ 10 triệu.

flowchart TB
  N["Mới / thay đổi: 20.000"] -->|"Incremental"| AB["🔌 Airbyte"] --> CH["ClickHouse · +20.000"]

Airbyte chỉ đồng bộ phần mới hoặc thay đổi (dựa trên một cursor). Đây là năng lực quyết định khi DataValue bước từ demo sang production.

Ở các nguồn database phù hợp, một cấp độ mạnh hơn là Change Data Capture. Thay vì liên tục hỏi “có record nào mới không?”, CDC nhận biết các thay đổi đã xảy ra ở nguồn — kể cả UPDATE và DELETE.

flowchart TB
  I["INSERT Customer"] & U["UPDATE Sales Order"] & D["DELETE Record"] --> CDC["CDC"] --> AB["🔌 Airbyte"] --> CH["ClickHouse"]

Schema Discovery — hiểu cấu trúc dữ liệu nguồn

Phần tiêu đề “Schema Discovery — hiểu cấu trúc dữ liệu nguồn”

Data ingestion không chỉ là copy bytes. Airbyte cần hiểu các streams / fields / schema mà source cung cấp để người vận hành chọn dữ liệu cần đồng bộ. Ví dụ source Odoo có: res_partner, product_product, sale_order, sale_order_line, purchase_order, account_move, account_move_line, stock_move…

Data team không nhất thiết đưa tất cả vào Data Platform. Có thể chọn Customer, Product, Sales Order, Sales Order Line, Purchase, Inventory, Invoice… và bỏ qua technical tables, temporary data, dữ liệu ứng dụng không cần cho phân tích.

Scheduling — dữ liệu được cập nhật khi nào?

Phần tiêu đề “Scheduling — dữ liệu được cập nhật khi nào?”

Một câu hỏi rất thực tế: dashboard đang dùng dữ liệu của thời điểm nào? Mỗi Connection của Airbyte có thể chạy theo lịch phù hợp. DataValue có thể phân loại: Master Data (Customer/Product) → đồng bộ định kỳ; Sales → thường xuyên; Finance → định kỳ có kiểm soát; Reference Data → hằng ngày.

Pipeline production chắc chắn sẽ có lúc thất bại: API timeout, mạng gián đoạn, credential hết hạn, source đổi schema, destination gặp vấn đề, data volume tăng đột biến. Nếu toàn bộ pipeline là custom script, Data team phải tự xây cơ chế theo dõi cho từng cái. Một platform như Airbyte chuẩn hóa việc vận hành Connection và sync — trạng thái, log, lần chạy, thử lại.

Data Integration không chỉ là “copy data”. Nó còn là operate data movement reliably — giá trị thường bị đánh giá thấp.

Đây là một ranh giới kiến trúc rất quan trọng. Airbyte không nên gánh toàn bộ transformation / business modeling. Airbyte đưa sale_order, sale_order_line, res_partner, product_product, account_move… sang ClickHouse; sau đó dbt mới biến chúng thành DimCustomer, DimProduct, DimDate, FactSales, FactInventory, FactPurchase, FactFinance.

  • Airbyte = Move Data
  • dbt = Transform Data

Đây là separation of concerns cốt lõi. Chi tiết phần T: xem tài liệu dbt.

Sau dbt ta đã có analytical model, nhưng vẫn còn câu hỏi ngữ nghĩa nghiệp vụ: “Revenue” chính xác là gì? (Invoice − Discount − Return − Cancellation?) “Active Customer” là có giao dịch trong 30, 60 hay 90 ngày? Đây là Business Semantics — trong DataValue, đó là vai trò của Cube:

flowchart LR
  AB["Airbyte<br/>Move"] --> CH["ClickHouse<br/>Store & Process"] --> DBT["dbt<br/>Transform & Model"] --> CUBE["Cube<br/>Define & Understand"] --> OUT["BI / AI"]

Một ví dụ hoàn chỉnh: Sales Analytics từ Odoo

Phần tiêu đề “Một ví dụ hoàn chỉnh: Sales Analytics từ Odoo”

Ban điều hành hỏi: “Doanh thu đang tăng hay giảm và nguyên nhân đến từ đâu?”

  1. Transaction — Sales team tạo đơn trong Odoo: Customer → Quotation → Sales Order → Delivery → Invoice.
  2. Airbyte — lấy các stream cần thiết (Customer, Product, Sales Order, Sales Order Line, Invoice, Payment) đưa vào ClickHouse.
  3. dbt — dựng DimCustomer/DimProduct/DimDate/DimSalesperson và FactSales/FactInvoice/FactPayment.
  4. Cube — định nghĩa Revenue, Gross/Net Revenue, Quantity, Average Selling Price theo Customer/Product/Region/Salesperson/Period.
  5. BI — dashboard: Revenue by Month · by Customer · by Product · by Salesperson · Actual vs Target.
  6. AI — agent hỏi tiếp “Vì sao doanh thu miền Nam giảm 12%?”, dựa trên dữ liệu tin cậy + ngữ nghĩa nghiệp vụ thay vì tự đoán cấu trúc raw DB.
  7. n8n — nếu một nhóm khách quan trọng giảm mua: tạo CRM Task → giao Salesperson → báo Manager → follow-up.

Toàn bộ vòng khép kín — và Airbyte là bước 2, nơi dữ liệu vận hành bước vào nền tảng.

Nếu bỏ Airbyte, ta có thể tự viết Python Script #1 → Customer, #2 → Sales, #3 → Product… Thêm Salesforce: more scripts. Thêm một ERP khác: more scripts. Ban đầu có vẻ đơn giản, nhưng càng về sau BSD sẽ phải tự duy trì một integration framework mà đáng lẽ một Data Integration Platform phải lo. Airbyte tạo ra ba lợi ích lớn:

Standardization

Một cơ chế thống nhất để đưa dữ liệu vào nền tảng.

Reusability

Không phải xây lại ingestion logic cho từng dự án.

Scalability

Thêm hệ thống nguồn mà kiến trúc lõi phía sau không đổi.

Tại sao DataValue chọn Airbyte thay vì dùng n8n cho ingestion?

Phần tiêu đề “Tại sao DataValue chọn Airbyte thay vì dùng n8n cho ingestion?”

Câu hỏi hay, vì DataValue dùng cả hai — chúng giải hai bài toán khác nhau:

Airbyten8n
Vai tròData MovementBusiness & Agentic Action
HướngBusiness Systems → Data PlatformData/AI → Business Applications
Tập trungIngestion · Replication · SyncWorkflow · Automation · AI action
flowchart TB
  SYS["Systems"] --> AB["Airbyte"] --> CH["ClickHouse"] --> DBT["dbt"] --> CUBE["Cube"]
  CUBE --> BI["BI"]
  CUBE --> AI["AI"] --> N8N["n8n"] --> APP["Business Applications"]

Airbyte đưa dữ liệu vào nền tảng. n8n đưa trí tuệ trở lại nghiệp vụ.

Chi tiết vì sao Airbyte là lớp ingestion chính (Replication vs Integration, state management, schema evolution, connector standardization…): Vì sao DataValue chọn Airbyte thay vì n8n →.

Airbyte giúp DataValue là một platform, không phải một dự án ETL

Phần tiêu đề “Airbyte giúp DataValue là một platform, không phải một dự án ETL”

Nếu DataValue chỉ xây cho Odoo, ta có thể viết vài ETL script là xong. Nhưng mục tiêu lớn hơn: hôm nay là Odoo → Airbyte → DataValue; ngày mai thêm Dynamics 365, SAP, Salesforce, database, external data… phía sau vẫn giữ nguyên ClickHouse → dbt → Cube → BI/AI → n8n. Đó là khác biệt giữa xây một ETL và xây một Data Platform tái sử dụng được.

Nhìn tổng thể, mỗi thành phần có một nhiệm vụ rất rõ:

Thành phầnNhiệm vụ
OdooOperate
AirbyteIngest & Replicate
ClickHouseStore & Process
dbtTransform & Model
CubeDefine & Understand
BIAnalyze
AIReason
n8nAutomate & Act

Cả chuỗi tạo thành: Operational Data → Trusted Data → Business Semantics → Insight → Intelligence → Action → Outcome. Airbyte đứng gần đầu chuỗi — nó không tạo dashboard, không định nghĩa KPI, không thay thế Semantic Layer, cũng không phải AI. Nhưng nếu dữ liệu không được đưa vào Data Platform một cách ổn định, nhất quán và mở rộng được, tất cả các lớp phía sau sẽ không có nền tảng để hoạt động.

Vì vậy trong DataValue: Airbyte là cánh cửa đưa dữ liệu vận hành vào Data & AI Platform — và từ cánh cửa đó, dữ liệu bắt đầu hành trình trở thành Data Value.

Chia sẻ: