
Cách mở rộng quy mô đường ống tích hợp mà không phá vỡ tính chính xác
Tài khoản sản xuất mở rộng quy trình tích hợp doanh nghiệp từ 500 lên 8.000 sự kiện mỗi giây và hai đảm bảo chính xác về thông lượng công việc không bao giờ được phép đánh đổi. Bài đăng Cách mở rộng quy mô đường ống tích hợp mà không phá vỡ tính chính xác xuất hiện đầu tiên trên Hướng tới khoa học dữ liệu.
Kỹ thuật dữ liệu
Cách mở rộng quy mô đường ống tích hợp mà không phá vỡ tính chính xác
Tài khoản sản xuất về thông lượng hoạt động đằng sau bước nhảy 16 lần - và cả hai đều đảm bảo rằng nó không bao giờ được phép đánh đổi
Âu Lâm Âu
Ngày 19 tháng 8 năm 2026
đọc 17 phút
Chia sẻ
Hình ảnh của tác giả, được tạo bằng ChatGPT.
Tôi đã đắn đo một lúc xem có nên viết điều này lên không. Công việc là tích hợp dữ liệu doanh nghiệp: kết nối dữ liệu từ nhiều hệ thống kinh doanh riêng biệt với nhau thông qua một đường dẫn. Đơn đặt hàng, hàng tồn kho, tài chính, hậu cần, hồ sơ khách hàng, cùng với hàng loạt kênh FTP kế thừa mà không ai muốn chạm vào. Hơn hai mươi hệ thống ở hai đầu của nó. Một vài triệu sự kiện mỗi ngày, gấp nhiều lần vào cuối tháng và trong các đợt bán hàng lớn.
Nghe có vẻ đơn giản. Hệ thống A gọi API của hệ thống B, có vấn đề gì đâu. Bất cứ ai đã thực sự làm điều này đều biết phần khó chịu không phải là bắt A nói chuyện với B. Nó phải giữ đúng sau khi nói. Trong số hơn 20 hệ thống, một số hệ thống mới và nói được REST, một số được thuê ngoài từ mười năm trước và chỉ nói được SOAP, và ít nhất một hệ thống chỉ biết cách thả tệp qua FTP. Các ngăn xếp ở khắp mọi nơi và độ tin cậy ở khắp mọi nơi, và khi có thứ gì đó bị hỏng, nó sẽ rơi vào bạn, bởi vì bạn là lớp ở giữa.
Bài viết này nói về vấn đề thứ ba trong số ba vấn đề mà quy trình buộc tôi phải giải quyết và vấn đề mà mọi người thường giải quyết đầu tiên và mắc sai lầm: thông lượng. Quy trình phải duy trì độ trễ hàng ngày dưới khoảng nửa giây và hấp thụ khối lượng bình thường khoảng mười lần vào lúc cao điểm, trong thực tế có nghĩa là hàng chục nghìn sự kiện một giây vào thời điểm cao điểm thông thường và nhiều hơn thế trong thời gian bán hàng. Cái bẫy là hầu hết mọi thứ bạn làm để tiến hành nhanh hơn cũng là một cách để âm thầm phá vỡ dữ liệu và một khi dữ liệu sai, bạn sẽ phát hiện ra điều đó vài tuần sau đó, từ tài chính, trong quá trình đối chiếu, đó là thời điểm tồi tệ nhất có thể xảy ra. Vì vậy, tôi không thể nói về tốc độ mà không nói rõ trước về tầng mà tôi không được phép xuống dưới.
Một lưu ý về nơi các con số đến từ
Trước bất kỳ số liệu nào dưới đây, cần phải trung thực về loại số của chúng. Mọi thứ tôi trích dẫn là chỉ số thời gian chạy phía người tiêu dùng được lấy từ đường dẫn trực tiếp trong quá trình hoạt động bình thường, không phải là điểm chuẩn được kiểm soát trên một cụm sạch. Thông lượng là các sự kiện được xử lý mỗi giây được đo tại người tiêu dùng, được đọc trong lưu lượng truy cập trong giờ làm việc thông thường thay vì vào lúc cao điểm; Khi tôi nói tỷ giá là "ổn định", ý tôi là nó được giữ trong mức chênh lệch bình thường trong toàn bộ chu kỳ kinh doanh chứ không phải là tôi đã ghim nó trong một lần chạy. Việc so sánh kích thước lô sau đó (50, 100, 200, 500) được chạy dựa trên tải sản xuất thực tế chứ không phải dữ liệu tổng hợp, đó là lý do tại sao câu trả lời dành riêng cho khối lượng công việc này chứ không phải là hằng số chung. Ở đâu một hình dáng mềm mại hơn vẻ ngoài của nó, tôi nói như vậy. Những con số này được thu thập qua nhiều chu kỳ bán hàng cuối tháng và cao điểm của hoạt động bình thường, không phải trong một lần chạy chuẩn duy nhất. Tôi đang báo cáo một trải nghiệm, không phải một nghiên cứu và giá trị của nó nằm ở các chế độ thất bại và sự đánh đổi, chứ không phải ở một tiêu chuẩn mà bạn có thể chạy lại.
Sàn: thứ gì không được phép phá vỡ
Hai đảm bảo nằm bên dưới mỗi thay đổi thông lượng và mọi tối ưu hóa ở phần sau của bài viết này đều được xây dựng để không thể vi phạm chúng.
Đầu tiên là phiên bản sau của trạng thái của thực thể không bao giờ có thể bị ghi đè bởi phiên bản trước đó. Trong một đường dẫn phân phối, cùng một bản cập nhật logic giống nhau xuất hiện nhiều lần và không theo thứ tự, mọi lúc. Mạng truyền lại, phân phối lại hàng đợi, người tiêu dùng khởi động lại giữa chuyến bay, hết thời gian chờ ngược dòng và gửi lại. Bạn không thể ngăn bất kỳ điều nào trong số đó xảy ra, vì vậy động thái duy nhất là làm cho đường dẫn ghi không quan tâm đến nó. Mọi thực thể đều mang một số phiên bản mà hệ thống nguồn sở hữu (không phải số mà đường ống phát minh ra, vì đường ống không biết khi nào nguồn thực sự thay đổi thứ gì đó) và bản ghi từ chối mọi thứ cũ:
public void upsertWithVersionCheck(EntitySync sync) {
int đã cập nhật = jdbcTemplate.update(
"CẬP NHẬT dữ liệu SET_store SET = ?, phiên bản = ?,update_at = NOW() " +
"WHERE thực thể_id = ? VÀ loại thực thể = ? VÀ phiên bản < ?",
sync.getData(), sync.getVersion(),
sync.getEntityId(), sync.getEntityType(), sync.getVersion()
);
nếu (đã cập nhật == 0) {
// một hàng hoàn toàn mới thành INSERT hoặc một phiên bản cũ hơn mà chúng ta nên bỏ
thử {
jdbcTemplate.update(
"XÁC NHẬN VÀO thực thể_store (entity_id, thực thể_type, dữ liệu, phiên bản) " +
"GIÁ TRỊ (?, ?, ?, ?)",
sync.getEntityId(), sync.getEntityType(),
sync.getData(), sync.getVersion());
} bắt (DuplicateKeyException e) {
// phiên bản mới hơn đã có sẵn; bỏ cái này là đúng
}
}
}
Về cơ bản, nó là bản rút gọn của lần ghi cuối cùng trong đó “cuối cùng” có nghĩa là phiên bản cao nhất, không phải phiên bản mới nhất. Quy tắc đó là điều cho phép tôi tích cực về tính song song sau này mà không cần phải tỉnh táo về việc sắp xếp thứ tự.
Đảm bảo thứ hai là “chúng tôi đã xử lý việc này chưa?” không bao giờ có thể sai được. Mọi bản ghi được chấp nhận đều ghi mục nhập nhật ký khấu trừ và dữ liệu kinh doanh của nó trong cùng một giao dịch cơ sở dữ liệu, vì vậy chúng sẽ cam kết cùng nhau hoặc hoàn toàn không. Nhật ký khấu trừ là nguồn sự thật duy nhất cho những gì đã được chấp nhận và nó không được phép sai lệch khỏi dữ liệu mà nó tuyên bố mô tả. Ngay từ đầu, chúng tôi đã thực hiện kiểm tra khấu trừ mã doanh nghiệp, truy vấn trước sau đó viết và ở mức độ đồng thời cao, khoảng cách giữa hai mã này sẽ để các bản sao lọt qua. Cách khắc phục là đẩy nó xuống ràng buộc khóa chính và để cơ sở dữ liệu cho chúng tôi biết. (Bảng nhật ký đó sẽ tăng lên mãi mãi nếu bạn cho phép; công việc hàng đêm sẽ cắt bớt các mục nhập cũ hơn ba mươi ngày, vượt quá khoảng thời gian thực sự xảy ra việc phân phối lại.)
Tôi dành vài đoạn này để nói về tính chính xác vì mọi thứ bên dưới đều giao dịch chống lại nó và giao dịch chỉ an toàn vì sàn này


Nguồn tin: Towards Data Science — Tác giả: Yuelin Ou. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.