+2

ACID vs. BASE: Chọn "Chắc" hay chọn "Nhanh" trong Cơ sở dữ liệu?

Nếu bạn là lập trình viên, kỹ sư dữ liệu, hay đơn giản là người tò mò về cách các hệ thống khổng lồ như Google, Facebook, hay các ứng dụng ngân hàng hoạt động, bạn chắc chắn đã từng nghe đến "ACID" và "BASE".

Khi thiết kế bất kỳ hệ thống nào, chúng ta đều đứng trước một ngã ba đường cơ bản: Bạn muốn hệ thống của mình "Chắc chắn" (như một ngân hàng, không bao giờ được sai một đồng) hay bạn muốn nó "Nhanh" (như một mạng xã hội, chấp nhận trễ vài giây để phục vụ hàng triệu người)?

Đây không chỉ là lựa chọn về công nghệ, đây là một lựa chọn về triết lý thiết kế. Và buổi hôm nay, chúng ta sẽ "mổ xẻ" hai triết lý này.

Gốc rễ của sự lựa chọn: "Lời nguyền" Định lý CAP

Trước khi đi vào ACID và BASE, chúng ta phải nói về "lời nguyền" đã sinh ra chúng: Định lý CAP (CAP Theorem).

Trong một hệ thống phân tán (dữ liệu nằm trên nhiều máy chủ), bạn luôn muốn 3 điều:

  1. Consistency (Nhất quán): Đọc dữ liệu ở bất kỳ đâu cũng phải thấy giống hệt nhau ngay lập tức.
  2. Availability (Sẵn sàng): Hệ thống luôn luôn phản hồi, không bao giờ "treo".
  3. Partition Tolerance (Chịu lỗi mạng): Nếu mạng bị "đứt" giữa các máy chủ, hệ thống vẫn phải tiếp tục hoạt động.

Định lý CAP nói rằng: Bạn không thể có cả 3 cùng một lúc. Khi sự cố mạng (P) xảy ra (điều này là không thể tránh khỏi), bạn bắt buộc phải chọn:

  • Chọn C (Nhất quán): Bạn thà "treo" hệ thống (mất A) chứ nhất quyết không trả về dữ liệu cũ/sai.
  • Chọn A (Sẵn sàng): Bạn thà trả về dữ liệu "cũ" vài giây (mất C) chứ nhất quyết không để hệ thống bị "treo".

Từ lựa chọn "đau đớn" này, hai trường phái đã ra đời.

ACID: Triết lý "Chắc chắn" của Ngân hàng

ACID là "tiêu chuẩn vàng" cho các hệ thống cơ sở dữ liệu quan hệ (SQL) như MySQL, PostgreSQL, Oracle. Nó giống như một hợp đồng 4 điều khoản "bất di bất dịch" để đảm bảo sự toàn vẹn tuyệt đối.

A - Atomicity (Nguyên tử)

  • Lời hứa: "Hoặc tất cả, hoặc không gì cả."
  • Ví dụ dễ hiểu: Khi bạn chuyển 500k từ A sang B, hệ thống phải đảm bảo 100% là: (1) Trừ 500k của A VÀ (2) Cộng 500k cho B. Nếu bước (2) thất bại (ví dụ máy chủ B bị sập), toàn bộ giao dịch sẽ được "hoàn tác" (rollback). Không có chuyện tiền bị "mất lơ lửng".

C - Consistency (Nhất quán)

  • Lời hứa: "Dữ liệu luôn 'đúng luật'."
  • Ví dụ dễ hiểu: Nếu luật là "số dư không được âm", thì dù 1000 người cùng rút tiền, hệ thống sẽ không bao giờ cho phép một giao dịch nào làm số dư của bạn âm.

I - Isolation (Cô lập)

  • Lời hứa: "Không 'dẫm chân' lên nhau."
  • Ví dụ dễ hiểu: Hai người cùng đặt 1 chiếc vé xem phim cuối cùng. Hệ thống sẽ "cô lập" hai giao dịch này, một người sẽ "thắng" (đặt được vé) và người kia sẽ "thua" (nhận thông báo hết vé). Sẽ không có chuyện cả hai cùng "nghĩ" là mình đã đặt được vé.

D - Durability (Bền vững)

  • Lời hứa: "Một khi đã lưu là... 'bất tử'."
  • Ví dụ dễ hiểu: Khi hệ thống đã báo "Chuyển tiền thành công!" (commit), thì dữ liệu đó phải được lưu an toàn. Kể cả ngay giây sau đó máy chủ có... mất điện, thì khi khởi động lại, giao dịch đó vẫn phải ở đó.

Khi nào dùng ACID? Bất cứ khi nào sự chính xác là "sống còn": Tài chính, Kế toán, Đặt vé máy bay, Quản lý kho hàng (nơi số lượng phải "chuẩn từng cái").

BASE: Triết lý "Nhanh" của Mạng xã hội

Khi các hệ thống Internet khổng lồ (NoSQL, Big Data, Microservices) ra đời, họ nhận ra ACID quá "chắc" và... quá chậm. Họ không thể bắt hàng tỷ người dùng "xếp hàng" chờ đợi. Họ cần tốc độ và khả năng mở rộng.

Triết lý BASE ra đời, là một sự đánh đổi: "Chấp nhận nhất quán muộn để đổi lấy hiệu năng."

B - Basically Available (Luôn "có mặt")

  • Lời hứa: Hệ thống luôn phản hồi (không "treo"), ngay cả khi dữ liệu trả về là của... vài giây trước. Thà "cũ" còn hơn "treo".

S - Soft-state (Trạng thái "mềm")

  • Lời hứa: Trạng thái của dữ liệu có thể thay đổi liên tục để "đuổi kịp" trạng thái mới nhất từ các máy chủ khác.

E - Eventually Consistent (Rút cục sẽ nhất quán)

  • Lời hứa: Đây là "trái tim" của BASE. Hệ thống không hứa dữ liệu sẽ "chuẩn" ở mọi nơi ngay lập tức. Nhưng nó hứa rằng, nếu bạn cho nó vài giây, tất cả các bản sao dữ liệu sẽ được đồng bộ và trở nên nhất quán.
  • Ví dụ kinh điển: Bạn "Like" một bài viết. Nút Like đổi màu ngay (Basically Available). Bạn thấy 101 Likes. Nhưng bạn của bạn ở Úc có thể F5 và vẫn thấy 100 Likes. Vài giây sau, khi F5 lại, họ sẽ thấy 101 Likes. Dữ liệu đã "eventually" (cuối cùng) nhất quán.

Khi nào dùng BASE? Bất cứ khi nào tốc độ và tính sẵn sàng quan trọng hơn sự chính xác tức thời: Mạng xã hội (Like, feed), đếm lượt xem (View count), hệ thống gợi ý sản phẩm, ghi log.

So sánh nhanh: ACID vs. BASE

Tiêu chí ACID (Phe "Chắc chắn") BASE (Phe "Nhanh & Linh hoạt")
Nhất quán Rất mạnh (Strict). Phải "chuẩn" ngay lập tức. "Rồi sẽ khớp" (Eventual). Chấp nhận trễ.
Sẵn sàng Thấp hơn. Sẵn sàng "treo" để đảm bảo nhất quán. Rất cao. Luôn phản hồi, thà trả dữ liệu cũ.
Tốc độ Chậm hơn (vì nhiều quy tắc) Rất nhanh (ít ràng buộc)
Mở rộng Khó mở rộng ngang (Scale-out) Rất dễ mở rộng ngang
"Chiến binh" tiêu biểu MySQL, PostgreSQL, SQL Server MongoDB, Cassandra, DynamoDB

Giải pháp thực tế: "Dùng cả hai!" (Mô hình Hybrid)

Đến đây, bạn có thể hỏi: "Vậy công ty tôi nên dùng cái nào?".

Câu trả lời của các hệ thống hiện đại (như Shopee, Grab, Netflix) là: "Dùng cả hai!". Họ là các Hệ thống lai (Hybrid). Họ dùng ACID cho phần "sống còn" và BASE cho phần "tốc độ".

Ví dụ một trang Thương mại Điện tử:

  1. Trải nghiệm "Lướt" (Dùng BASE):

    • Bạn xem sản phẩm, đọc review, xem gợi ý.
    • Yêu cầu: Phải thật nhanh, mượt.
    • Chấp nhận: Việc gợi ý sản phẩm trễ 1 phút hay lượt xem cập nhật chậm vài giây là hoàn toàn ổn.
    • -> Dùng BASE (ví dụ: Elasticsearch, Redis).
  2. Giỏ hàng (Dùng BASE):

    • Bạn thêm/bớt đồ vào giỏ hàng.
    • Yêu cầu: Phải nhanh.
    • Chấp nhận: Việc giỏ hàng trên điện thoại cập nhật trễ 1-2 giây so với trên máy tính là chấp nhận được.
    • -> Dùng BASE (ví dụ: MongoDB).
  3. "Chốt đơn" & Thanh toán (Dùng ACID):

    • Khoảnh khắc bạn nhấn nút "Đặt hàng".
    • Yêu cầu: Chính xác tuyệt đối.
    • Bắt buộc: Hệ thống phải đảm bảo (Atomic): (1) Trừ tiền VÀ (2) Trừ hàng trong kho VÀ (3) Tạo đơn hàng. Nếu 1 trong 3 bước lỗi, tất cả phải được hoàn tác.
    • -> Dùng ACID (ví dụ: PostgreSQL, MySQL).

Kết luận: Không có "Tốt nhất", chỉ có "Phù hợp nhất"

Cuộc chiến giữa ACID và BASE không có người thắng tuyệt đối.

  • ACID là lời hứa về sự Tin cậy.
  • BASE là lời hứa về Tốc độQuy mô.

Là một kỹ sư, nhiệm vụ của chúng ta không phải là "chọn phe", mà là hiểu rõ bài toán kinh doanh. Hãy tự hỏi: "Tại điểm này, nghiệp vụ này, tôi cần Chắc hay cần Nhanh?"

Chọn đúng "vũ khí" cho đúng "trận chiến", đó chính là chìa khóa để xây dựng một hệ thống tuyệt vời.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí