Đồng bộ dữ liệu gia tăng với checkpoints: giữ các hệ thống khớp nhau an toàn
Đồng bộ dữ liệu gia tăng với checkpoints giúp giữ các hệ thống khớp nhau bằng con trỏ, hash và resume token, để bạn có thể tiếp tục an toàn mà không phải import lại toàn bộ.

Tại sao reimport toàn bộ cứ gây rắc rối
Reimport toàn bộ trông an toàn vì nghe có vẻ đơn giản: xóa, tải lại, xong. Nhưng thực tế, đó là một trong những cách dễ nhất để tạo đồng bộ chậm, chi phí tăng và dữ liệu lộn xộn.
Vấn đề đầu tiên là thời gian và chi phí. Kéo toàn bộ dataset mỗi lần chạy nghĩa là bạn tải lại cùng bản ghi nhiều lần. Nếu bạn đồng bộ 500.000 khách hàng mỗi đêm, bạn phải trả chi phí cho compute, cuộc gọi API và ghi vào cơ sở dữ liệu ngay cả khi chỉ 200 bản ghi thay đổi.
Vấn đề thứ hai là tính chính xác. Reimport toàn bộ thường tạo trùng lặp (vì quy tắc ghép đôi không hoàn hảo), hoặc ghi đè các chỉnh sửa mới hơn bằng dữ liệu cũ hơn có trong export. Nhiều đội cũng thấy tổng số bị dịch dần theo thời gian vì “xóa và tải lại” bị lỗi nửa chừng.
Các triệu chứng điển hình như sau:
- Số lượng không khớp giữa các hệ thống sau khi chạy
- Bản ghi xuất hiện hai lần với vài khác biệt nhỏ (chữ hoa/chữ thường email, định dạng số điện thoại)
- Các trường vừa được cập nhật bị lật về giá trị cũ
- Đồng bộ đôi khi “hoàn thành” nhưng bỏ sót một phần dữ liệu
- Vé support tăng mạnh sau mỗi cửa sổ import
Một checkpoint chỉ là một dấu nhỏ lưu lại rằng “tôi đã xử lý đến đây.” Lần sau, bạn tiếp tục từ dấu đó thay vì bắt đầu lại. Dấu này có thể là timestamp, ID bản ghi, số phiên bản, hoặc token trả về từ API.
Nếu mục tiêu thực sự của bạn là giữ hai hệ thống đồng bộ theo thời gian, đồng bộ dữ liệu gia tăng với checkpoints thường là lựa chọn tốt hơn. Nó hữu ích khi dữ liệu thay đổi thường xuyên, export lớn, API giới hạn tần suất, hoặc bạn cần đồng bộ có thể tiếp tục an toàn sau crash (ví dụ khi một job bị lỗi giữa chừng trong công cụ nội bộ bạn xây trên nền tảng như AppMaster).
Xác định mục tiêu đồng bộ trước khi chọn phương pháp
Đồng bộ gia tăng với checkpoints chỉ hoạt động tốt khi bạn rõ “đúng” nghĩa là gì. Nếu bỏ qua bước này và lao vào con trỏ hoặc hash, thường bạn sẽ phải xây lại đồng bộ sau vì các quy tắc chưa được ghi lại.
Bắt đầu bằng cách đặt tên các hệ thống và quyết định ai là nguồn sự thật. Ví dụ, CRM có thể là nguồn sự thật cho tên và số điện thoại khách hàng, trong khi công cụ thanh toán là nguồn sự thật cho trạng thái đăng ký. Nếu cả hai hệ thống đều có thể sửa cùng một trường, bạn không có một nguồn sự thật duy nhất và phải lên kế hoạch cho xung đột.
Tiếp theo, định nghĩa “đồng bộ” nghĩa là gì. Bạn cần khớp chính xác mọi lúc, hay chấp nhận cập nhật xuất hiện trong vài phút? Khớp chính xác thường yêu cầu thứ tự chặt chẽ hơn, đảm bảo checkpoint mạnh hơn và xử lý xóa cẩn thận hơn. Tính nhất quán cuối cùng thường rẻ hơn và chịu lỗi tạm thời tốt hơn.
Quyết định hướng đồng bộ. Đồng bộ một chiều đơn giản hơn: Hệ thống A cấp dữ liệu cho hệ thống B. Đồng bộ hai chiều khó hơn vì mọi cập nhật có thể là xung đột, và bạn phải tránh vòng lặp vô tận nơi mỗi bên liên tục “sửa” bên kia.
Các câu hỏi cần trả lời trước khi xây
Ghi ra các quy tắc đơn giản mà mọi người đồng ý:
- Hệ thống nào là nguồn sự thật cho mỗi trường (hoặc mỗi loại object)?
- Độ trễ chấp nhận được là bao nhiêu (giây, phút, giờ)?
- Đây là một chiều hay hai chiều, và sự kiện nào chảy theo hướng nào?
- Xóa được xử lý thế nào (xóa cứng, xóa mềm, tombstone)?
- Khi cả hai bên cùng sửa một bản ghi thì sao?
Một bộ quy tắc giải quyết xung đột thực tế có thể đơn giản như “billing thắng cho trường subscription, CRM thắng cho trường liên hệ, còn lại cập nhật mới hơn thắng.” Nếu bạn xây tích hợp trong công cụ như AppMaster, hãy lưu các quy tắc này trong Business Process để chúng luôn hiển thị và có thể kiểm thử, không bị chôn trong ký ức ai đó.
Con trỏ, hash và resume token: các viên gạch xây dựng
Đồng bộ gia tăng với checkpoints thường dựa vào một trong ba “vị trí” bạn có thể lưu và dùng lại an toàn. Lựa chọn phù hợp phụ thuộc vào những gì hệ thống nguồn đảm bảo và các lỗi bạn cần chịu đựng.
Checkpoint bằng con trỏ là đơn giản nhất. Bạn lưu “thứ cuối cùng tôi đã xử lý” như last ID, last updated_at timestamp, hoặc số thứ tự. Lần tiếp theo bạn yêu cầu các bản ghi sau điểm đó. Cách này hoạt động tốt khi nguồn sắp xếp nhất quán và ID/timestamps tiến về phía trước đáng tin cậy. Nó vỡ khi cập nhật đến muộn, đồng hồ khác nhau, hoặc bản ghi có thể được chèn “về quá khứ” (ví dụ dữ liệu backfill).
Hash giúp phát hiện thay đổi khi con trỏ một mình chưa đủ. Bạn có thể băm từng bản ghi (dựa trên các trường bạn quan tâm) và chỉ đồng bộ khi hash thay đổi. Hoặc băm cả lô để nhanh chóng phát hiện drift rồi zoom vào. Hash theo bản ghi chính xác nhưng tốn lưu trữ và tính toán. Hash theo lô rẻ hơn nhưng có thể che dấu mục đã thay đổi.
Resume token là các giá trị mờ mà nguồn phát hành, thường cho phân trang hoặc luồng sự kiện. Bạn không giải nghĩa chúng, chỉ lưu và truyền lại để tiếp tục. Token tuyệt vời khi API phức tạp, nhưng chúng có thể hết hạn, trở nên vô hiệu sau cửa sổ retention, hoặc hành xử khác nhau giữa môi trường.
Nên dùng gì, và những gì có thể sai
- Con trỏ: nhanh và đơn giản, nhưng chú ý cập nhật ngoài thứ tự.
- Hash theo bản ghi: phát hiện thay đổi chính xác, nhưng chi phí cao hơn.
- Hash theo lô: tín hiệu drift rẻ, nhưng không chỉ rõ.
- Resume token: an toàn cho phân trang, nhưng có thể hết hạn hoặc chỉ dùng một lần.
- Kết hợp (con trỏ + hash): phổ biến khi
updated_atkhông hoàn toàn đáng tin.
Nếu bạn xây sync trong công cụ như AppMaster, các checkpoint này thường nằm trong một bảng “sync state” nhỏ, để mỗi lần chạy có thể tiếp tục mà không đoán mò.
Thiết kế nơi lưu checkpoint
Nơi lưu checkpoint là phần nhỏ nhưng làm cho đồng bộ gia tăng với checkpoints đáng tin. Nếu nó khó đọc, dễ ghi đè, hoặc không gắn với job cụ thể, sync sẽ trông ổn cho đến khi nó lỗi một lần, rồi bạn phải đoán mò.
Đầu tiên, chọn nơi checkpoint nằm. Bảng cơ sở dữ liệu thường an toàn vì hỗ trợ transaction, audit và truy vấn đơn giản. Key-value store có thể dùng nếu bạn đã sử dụng và nó hỗ trợ cập nhật nguyên tử. File cấu hình chỉ hợp lý cho sync một người dùng, rủi ro thấp vì khó khoá và dễ mất.
Lưu gì (và vì sao)
Một checkpoint hơn cả con trỏ. Lưu đủ ngữ cảnh để debug, resume và phát hiện drift:
- Nhận dạng job: tên job, tenant hoặc account id, loại object (ví dụ: customers)
- Tiến độ: giá trị con trỏ hoặc resume token, kèm loại con trỏ (time, id, token)
- Tín hiệu sức khỏe: thời điểm chạy lần cuối, trạng thái, số bản ghi đọc và ghi
- An toàn: last successful cursor (không chỉ last attempted), và thông báo lỗi ngắn cho lần thất bại gần nhất
Nếu dùng hash phát hiện thay đổi, lưu cả phiên bản phương pháp hash. Nếu không, bạn có thể thay đổi hash sau này và vô tình coi mọi thứ là “đã thay đổi.”
Phiên bản hóa và nhiều job đồng bộ
Khi mô hình dữ liệu thay đổi, hãy version checkpoint. Cách dễ nhất là thêm trường schema_version và tạo hàng mới cho phiên bản mới, thay vì chỉnh sửa dữ liệu cũ. Giữ các hàng cũ một thời gian để có thể rollback.
Với nhiều job đồng bộ, namespace mọi thứ. Khóa tốt là (tenant_id, integration_id, object_name, job_version). Điều đó tránh lỗi kinh điển khi hai job chia sẻ một con trỏ và lặng lẽ bỏ sót dữ liệu.
Ví dụ cụ thể: nếu bạn xây sync như công cụ nội bộ trong AppMaster, lưu checkpoint trong PostgreSQL với một hàng cho mỗi tenant và object, và chỉ cập nhật sau khi commit batch thành công.
Từng bước: triển khai vòng lặp đồng bộ gia tăng
Đồng bộ gia tăng với checkpoints hoạt động tốt nhất khi vòng lặp của bạn nhàm chán và có thể dự đoán. Mục tiêu đơn giản: đọc thay đổi theo thứ tự ổn định, ghi an toàn, rồi tiến con trỏ chỉ khi biết ghi đã xong.
Một vòng lặp đơn giản đáng tin
Trước hết, chọn thứ tự mà cùng một bản ghi không thay đổi. Timestamp có thể dùng, nhưng chỉ khi bạn thêm tie-breaker (như ID) để hai cập nhật cùng thời điểm không xáo trộn.
Rồi chạy vòng như sau:
- Quyết định con trỏ của bạn (ví dụ:
last_updated + id) và kích thước trang. - Lấy trang bản ghi tiếp theo mới hơn checkpoint đã lưu.
- Upsert từng bản ghi vào đích (tạo nếu chưa có, cập nhật nếu đã có) và ghi nhận lỗi.
- Commit các ghi thành công, rồi lưu checkpoint mới từ bản ghi cuối đã xử lý.
- Lặp lại. Nếu trang rỗng, ngủ một lát rồi thử lại.
Giữ việc cập nhật checkpoint tách biệt với fetch. Nếu bạn lưu checkpoint quá sớm, crash có thể khiến bạn lặng lẽ bỏ sót dữ liệu.
Backoff và retry mà không trùng lặp
Giả sử các cuộc gọi sẽ thất bại. Khi fetch hoặc write lỗi, retry với backoff ngắn (ví dụ: 1s, 2s, 5s) và giới hạn số lần retry. Làm retry an toàn bằng cách dùng upsert và khiến các ghi idempotent (cùng input, cùng kết quả).
Ví dụ nhỏ thực tế: nếu bạn đồng bộ cập nhật khách hàng mỗi phút, có thể fetch 200 thay đổi mỗi lần, upsert chúng, và chỉ sau đó lưu last customer’s (updated_at, id) làm cursor mới.
Nếu bạn xây trong AppMaster, bạn có thể mô hình checkpoint trong một bảng đơn giản (Data Designer) và chạy vòng trong Business Process fetch, upsert và cập nhật checkpoint trong một luồng được kiểm soát.
Làm cho resume an toàn: idempotency và checkpoint nguyên tử
Nếu sync có thể resume, nó sẽ resume vào thời điểm tệ nhất: sau timeout, crash, hoặc deploy một phần. Mục tiêu: chạy lại cùng một batch không tạo trùng lặp hoặc mất cập nhật.
Idempotency là mạng lưới an toàn. Bạn có được nó bằng cách ghi theo cách có thể lặp lại mà không thay đổi kết quả cuối cùng. Thực tế thường nghĩa là dùng upsert, không phải insert: ghi bản ghi bằng một khóa ổn định (như customer_id), và cập nhật hàng tồn nếu đã có.
Khóa ghi tốt là thứ bạn tin cậy qua retry. Các lựa chọn phổ biến là ID tự nhiên từ hệ thống nguồn, hoặc một khóa tổng hợp bạn lưu lần đầu thấy bản ghi. Hỗ trợ nó bằng ràng buộc unique để database cưỡng chế quy tắc khi hai worker tranh giành.
Checkpoint nguyên tử cũng quan trọng. Nếu bạn tiến checkpoint trước khi dữ liệu được commit, crash có thể khiến bạn bỏ qua bản ghi mãi mãi. Xử lý cập nhật checkpoint như một phần cùng đơn vị công việc với ghi dữ liệu.
Mẫu đơn giản cho đồng bộ gia tăng với checkpoints:
- Đọc thay đổi từ checkpoint cuối (cursor hoặc token).
- Upsert từng bản ghi dùng khóa dedupe.
- Commit transaction.
- Chỉ sau đó persist checkpoint mới.
Cập nhật ngoài thứ tự và dữ liệu đến muộn là cái bẫy khác. Một bản ghi có thể được cập nhật lúc 10:01 nhưng đến sau bản từ 10:02, hoặc API có thể trả lại thay đổi cũ khi retry. Bảo vệ bằng cách lưu một last_modified từ nguồn và áp dụng quy tắc “last write wins”: chỉ ghi đè khi bản ghi đến mới hơn dữ liệu hiện có.
Nếu cần bảo vệ mạnh hơn, giữ một cửa sổ chồng lặp nhỏ (ví dụ, đọc lại vài phút cuối) và dựa vào upsert idempotent để bỏ qua bản trùng. Điều này tăng chút công việc nhưng làm resume trở nên nhàm chán — và đó chính là điều bạn cần.
Trong AppMaster, cùng ý tưởng dễ chuyển thành Business Process: làm logic upsert trước, commit, rồi lưu cursor hoặc resume token ở bước cuối.
Sai lầm phổ biến làm vỡ đồng bộ gia tăng
Phần lớn bug đồng bộ không phải do code. Chúng đến từ vài giả định trông an toàn cho đến khi dữ liệu thực xuất hiện. Nếu muốn đồng bộ gia tăng với checkpoints đáng tin, hãy chú ý các bẫy này sớm.
Các điểm thất bại thường gặp
Một sai lầm phổ biến là tin quá nhiều vào updated_at. Một số hệ thống ghi lại timestamp trong backfill, sửa timezone, chỉnh sửa hàng loạt, hoặc thậm chí read-repair. Nếu con trỏ là timestamp thuần túy, bạn có thể bỏ sót bản ghi (timestamp nhảy lùi) hoặc xử lý lại khoảng lớn (timestamp nhảy tiến).
Bẫy khác là cho rằng ID liên tục hay tăng dần. Import, sharding, UUID, và hàng bị xóa phá vỡ ý tưởng đó. Nếu dùng “last seen ID” làm checkpoint, khoảng trống và ghi ngoài thứ tự có thể để lại bản ghi.
Bug gây hại nhất là tiến checkpoint khi chỉ thành công một phần. Ví dụ, fetch 1.000 bản ghi, ghi được 700, rồi crash, nhưng vẫn lưu “next cursor” từ fetch. Khi resume, 300 còn lại không bao giờ được thử lại.
Xóa cũng dễ bị bỏ qua. Nguồn có thể xóa mềm (đánh dấu), xóa cứng (bản ghi bị xoá), hoặc “bỏ publish” (chuyển trạng thái). Nếu bạn chỉ upsert bản ghi active, đích sẽ dần lệch.
Cuối cùng, thay đổi schema có thể làm vô hiệu hash cũ. Nếu hash được xây từ tập trường, thêm hoặc đổi tên trường có thể khiến “không thay đổi” trông như “thay đổi” (hoặc ngược lại) trừ khi bạn version logic hash.
Các mặc định an toàn hơn:
- Ưu tiên con trỏ đơn điệu (event ID, log position) hơn timestamp thô khi có thể.
- Xử lý viết checkpoint như cùng biên giới thành công với ghi dữ liệu.
- Theo dõi xóa rõ ràng (tombstone, chuyển trạng thái, hoặc reconcile định kỳ).
- Version các input hash và giữ khả năng đọc các phiên bản cũ.
- Thêm cửa sổ chồng lặp nhỏ (đọc lại N item cuối) nếu nguồn có thể đổi thứ tự.
Nếu bạn xây trong AppMaster, mô hình checkpoint như bảng riêng trong Data Designer và giữ bước “ghi dữ liệu + ghi checkpoint” cùng một Business Process để retry không bỏ sót công việc.
Giám sát và phát hiện drift mà không ồn ào
Giám sát tốt cho đồng bộ gia tăng với checkpoints ít liên quan đến “nhiều log hơn” mà nhiều hơn là vài con số bạn tin cậy mỗi lần chạy. Nếu bạn trả lời được “chúng ta đã xử lý gì, mất bao lâu, và sẽ tiếp tục từ đâu?”, bạn có thể debug hầu hết vấn đề trong vài phút.
Bắt đầu bằng cách ghi một bản tóm tắt chạy mỗi lần sync thực thi. Giữ nó nhất quán để so sánh các lần chạy và phát hiện xu hướng.
- Start cursor (hoặc resume token) và end cursor
- Số bản ghi fetch, số bản ghi ghi, số bản ghi bỏ qua
- Thời gian chạy và thời gian trung bình cho mỗi bản ghi (hoặc mỗi trang)
- Số lỗi với nguyên nhân lỗi hàng đầu
- Trạng thái ghi checkpoint (thành công/thất bại)
Phát hiện drift là lớp tiếp theo: nó cho biết khi hai hệ thống “đều hoạt động” nhưng dần lệch. Tổng số đôi khi đánh lừa, nên kết hợp kiểm tra tổng nhẹ với kiểm tra ngẫu nhiên. Ví dụ, hàng ngày so sánh tổng khách hàng active ở cả hai hệ thống, rồi lấy mẫu 20 ID khách hàng ngẫu nhiên và xác nhận vài trường (status, updated_at, email). Nếu tổng khác nhưng mẫu khớp, có thể bạn đang thiếu xóa hoặc lọc. Nếu mẫu khác, hash phát hiện thay đổi hoặc mapping trường có lỗi.
Cảnh báo nên hiếm và có thể hành động. Quy tắc đơn giản: chỉ cảnh báo khi con người phải can thiệp ngay.
- Con trỏ đứng yên (end cursor không tiến trong N lần chạy)
- Tỷ lệ lỗi tăng (ví dụ từ 1% lên 5% trong một giờ)
- Thời gian chạy tăng (vượt trần bình thường)
- Backlog tăng (thay đổi mới đến nhanh hơn khả năng sync)
- Drift được xác nhận (tổng không khớp hai lần liên tiếp)
Sau lỗi, chạy lại mà không dọn dẹp thủ công bằng cách replay an toàn. Cách dễ nhất là resume từ checkpoint đã commit cuối, không phải bản “seen” cuối. Nếu dùng cửa sổ chồng lặp nhỏ (đọc lại trang cuối), làm các ghi idempotent: upsert theo ID ổn định và chỉ tiến checkpoint sau ghi thành công. Trong AppMaster, các đội thường triển khai các kiểm tra này trong Business Process và gửi cảnh báo qua email/SMS hoặc module Telegram để lỗi hiển thị mà không cần theo dõi dashboard liên tục.
Checklist nhanh trước khi đưa sync vào sản xuất
Trước khi bật đồng bộ gia tăng với checkpoints lên production, kiểm tra nhanh vài chi tiết thường gây bất ngờ muộn. Những kiểm tra này mất vài phút nhưng ngăn được vài ngày debug “tại sao chúng ta bỏ sót bản ghi?”.
Danh sách tiền xuất xưởng thực tế:
- Đảm bảo trường bạn dùng để sắp xếp (timestamp, sequence, ID) thực sự ổn định và có index ở phía nguồn. Nếu nó có thể thay đổi sau đó, con trỏ sẽ drift.
- Xác nhận key upsert là duy nhất, và cả hai hệ thống xử lý giống nhau (phân biệt chữ hoa/chữ thường, trim, định dạng). Nếu một hệ thống lưu "ABC" còn hệ khác lưu "abc", bạn sẽ thấy trùng lặp.
- Lưu checkpoint riêng cho từng job và từng dataset. “Global last cursor” nghe đơn giản nhưng vỡ khi bạn sync hai bảng, hai tenant, hoặc hai filter.
- Nếu nguồn là eventually consistent, thêm cửa sổ chồng lặp nhỏ. Ví dụ, khi resume từ
last_updated = 10:00:00, khởi động lại từ 09:59:30 và dựa vào upsert idempotent để bỏ qua bản trùng. - Lên kế hoạch reconcile nhẹ: theo lịch, chọn mẫu nhỏ (như 100 bản ghi ngẫu nhiên) và so sánh các trường chính để phát hiện drift thầm lặng.
Bài kiểm tra thực tế nhanh: tạm dừng sync giữa chừng, khởi động lại và xác nhận kết quả cuối cùng như cũ. Nếu restart thay đổi số lượng hoặc tạo thêm hàng, sửa trước khi ra mắt.
Nếu bạn xây trong AppMaster, gắn dữ liệu checkpoint của từng luồng tích hợp vào process và dataset cụ thể, không dùng chung cho các automation không liên quan.
Ví dụ: đồng bộ bản ghi khách hàng giữa hai app
Hãy tưởng tượng thiết lập đơn giản: CRM là nguồn sự thật cho contacts, và bạn muốn cùng người đó tồn tại trong công cụ support (để ticket liên kết đúng khách hàng) hoặc portal khách hàng (để user đăng nhập và thấy tài khoản).
Lần chạy đầu, làm một import một lần. Kéo contacts theo thứ tự ổn định, ví dụ theo updated_at cộng id làm tie-breaker. Sau khi ghi mỗi batch vào đích, lưu checkpoint như: last_updated_at và last_id. Checkpoint này là vạch xuất phát cho các lần chạy tiếp theo.
Cho các lần chạy tiếp, chỉ fetch bản ghi mới hơn checkpoint. Cập nhật đơn giản: nếu contact CRM đã tồn tại, cập nhật đích; nếu không, tạo mới. Merge là phần phức tạp. CRM thường merge duplicate và giữ một contact “thắng”. Hãy coi đó là cập nhật khiến contact thua cuộc “nghỉ” bằng cách đánh dấu inactive (hoặc map sang người thắng) để bạn không có hai user portal cho cùng một người.
Xóa hiếm khi xuất hiện trong truy vấn “updated since”, nên phải lập kế hoạch. Các lựa chọn phổ biến là flag xóa mềm tại nguồn, feed riêng “deleted contacts”, hoặc reconcile định kỳ nhẹ kiểm tra ID thiếu.
Bây giờ trường hợp thất bại: sync crash giữa chừng. Nếu bạn chỉ lưu checkpoint ở cuối, bạn sẽ xử lý lại khối lớn. Thay vào đó, dùng resume token cho mỗi batch.
- Bắt đầu chạy và tạo một
run_id(resume token) - Xử lý một batch, ghi thay đổi vào đích, rồi atomically lưu checkpoint liên kết với
run_id - Khi restart, phát hiện checkpoint đã lưu cuối cho
run_idđó và tiếp tục từ đó
Thành công trông nhàm chán: số lượng ổn định hàng ngày, thời gian chạy dự đoán được, và chạy lại cùng cửa sổ không tạo thay đổi bất ngờ.
Bước tiếp theo: chọn mẫu và xây ít phải làm lại
Khi vòng lặp gia tăng đầu tiên chạy ổn, cách nhanh nhất để tránh làm lại là ghi ra quy tắc của sync. Giữ ngắn: record nào thuộc phạm vi, trường nào thắng khi xung đột, và “xong” nghĩa là gì sau mỗi lần chạy.
Bắt đầu nhỏ. Chọn một dataset (như customers) và chạy end-to-end: import ban đầu, cập nhật gia tăng, xóa, và resume sau một thất bại có chủ ý. Sửa giả định bây giờ dễ hơn là sau khi thêm năm bảng nữa.
Đôi khi rebuild toàn bộ vẫn là lựa chọn đúng. Làm khi trạng thái checkpoint bị hỏng, khi bạn đổi identifier, hoặc khi thay đổi schema phá hỏng phát hiện thay đổi (ví dụ dùng hash và nghĩa của trường thay đổi). Nếu rebuild, coi đó là thao tác có kiểm soát, không phải nút cứu khẩn cấp.
Cách an toàn để reimport mà không downtime:
- Import vào bảng shadow hoặc dataset song song, giữ bản hiện tại hoạt động.
- Xác thực số lượng và kiểm tra mẫu, bao gồm các edge case (nulls, record bị merge).
- Backfill quan hệ, rồi chuyển reader sang dataset mới trong một cutover đã lên kế hoạch.
- Giữ dataset cũ một cửa sổ rollback ngắn, rồi dọn dẹp.
Nếu bạn muốn làm điều này mà không viết code, AppMaster giúp gom các phần vào một chỗ: mô hình dữ liệu trong PostgreSQL bằng Data Designer, định nghĩa quy tắc sync trong Business Process Editor, và chạy job theo lịch kéo, chuyển đổi và upsert bản ghi. Vì AppMaster tái tạo mã sạch khi yêu cầu thay đổi, nó cũng làm cho việc “cần thêm một trường” bớt rủi ro.
Trước khi mở rộng sang nhiều dataset, tài liệu hóa hợp đồng sync, chọn một mẫu (con trỏ, resume token, hoặc hash), và làm một sync thật đáng tin. Rồi lặp lại cấu trúc cho dataset tiếp theo. Nếu muốn thử nhanh, tạo một ứng dụng trong AppMaster và chạy một job sync nhỏ có lịch trình trước.


