CAP Theorum
Khi tiến xa hơn trong sự nghiệp làm lập trình viên, tôi sẽ cần suy nghĩ nhiều hơn về software architecture và system design. Việc thiết kế các system hiệu quả và đưa ra sự cân nhắc về quy mô là rất quan trọng. System design là một lĩnh vực rộng lớn bao gồm nhiều khái niệm quan trọng. Một khái niệm cơ bản trong thiết kế hệ thống là định lý CAP. Hiểu định lý CAP là yếu tố quan trọng để biết cách thiết kế các hệ thống phân tán mạnh mẽ. Hôm nay, chúng ta sẽ đi sâu vào định lý CAP, giải thích ý nghĩa, các thành phần và nhiều hơn nữa.
Let’s get started!
Chúng ta sẽ bàn về:
- Định lý CAP là gì?
- Consistency, availability, và partition tolerance
- Định lý CAP và cơ sở dữ liệu NoSQL
- Định lý CAP và microservices
- Tổng kết và bước tiếp theo
Định lý CAP là gì?
Định lý CAP, hay định lý Brewer, là một định lý cơ bản trong lĩnh vực system design. Nó được trình bày lần đầu vào năm 2000 bởi Eric Brewer, một giáo sư khoa học máy tính tại Đại học California, Berkeley, trong một buổi nói chuyện về nguyên tắc của tính toán phân tán. Vào năm 2002, các giáo sư Nancy Lynch và Seth Gilbert của MIT đã công bố một chứng minh cho Giả thuyết của Brewer. Định lý CAP xác định rằng một hệ thống phân tán chỉ có thể cung cấp đồng thời hai trong ba thuộc tính sau: consistency, availability và partition tolerance. Định lý này hình thức hóa sự cân đối giữa tính nhất quán và khả dụng khi xảy ra chia lớp.
Một hệ thống phân tán là một tập hợp các máy tính hoạt động cùng nhau để hình thành một máy tính duy nhất cho người dùng cuối. Tất cả các máy tính phân tán đều có một trạng thái chia sẻ và hoạt động đồng thời. Với hệ thống phân tán, người dùng phải có khả năng giao tiếp với bất kỳ máy tính phân tán nào mà không biết rằng đó chỉ là một máy tính duy nhất. Hệ thống mạng phân tán lưu trữ dữ liệu của nó trên nhiều node, sử dụng nhiều máy vật lý hoặc ảo cùng một lúc.
Chứng minh định lý CAP
Hãy xem một chứng minh đơn giản của định lý CAP. Hãy tưởng tượng một hệ thống phân tán gồm hai node:

Hệ thống phân tán hoạt động như một bảng ghi thông thường với giá trị của biến X. Xảy ra một sự cố mạng dẫn đến chia lớp mạng giữa hai node trong hệ thống. Một người dùng cuối thực hiện yêu cầu write và sau đó là yêu cầu read. Hãy xem xét một trường hợp mà mỗi yêu cầu được xử lý bởi một node khác nhau trong hệ thống. Trong trường hợp này, hệ thống của chúng ta có hai lựa chọn:
- Hệ thống có thể gặp lỗi tại một trong các request, làm hỏng tính availability của hệ thống.
- Hệ thống có thể thực hiện cả hai request, trả về giá trị lỗi từ yêu cầu read và làm hỏng tính consistency của hệ thống.
Hệ thống không thể xử lý cả hai yêu cầu thành công trong khi đảm bảo rằng yêu cầu read trả về giá trị mới nhất được ghi bởi yêu cầu write. Điều này xảy ra vì kết quả của thao tác ghi không thể được truyền từ node A đến node B do chia lớp mạng.
Consistency, availability, và partition tolerance
Bây giờ khi chúng ta đã hiểu cơ bản về định lý CAP, hãy phân tích các từ viết tắt và thảo luận về ý nghĩa của tính nhất quán (consistency), khả dụng (availability) và khả năng chống chia lớp (partition tolerance).
- Tính consistency: Trong một hệ thống nhất quán, tất cả các node nhìn thấy dữ liệu giống nhau cùng một lúc. Nếu chúng ta thực hiện một thao tác read trên một hệ thống nhất quán, nó sẽ trả về giá trị của thao tác ghi mới nhất. Thao tác đọc sẽ khiến tất cả các node trả về cùng một dữ liệu. Tất cả người dùng nhìn thấy cùng một dữ liệu cùng một thời điểm, bất kể node nào họ kết nối đến. Khi dữ liệu được ghi vào một node duy nhất, nó được sao chép qua các nút khác trong hệ thống.
- Availability: Khi có tính khả dụng trong một hệ thống phân tán, điều đó có nghĩa là hệ thống vẫn hoạt động mọi lúc. Mọi yêu cầu đều nhận được phản hồi bất kể trạng thái cá nhân của các nút. Điều này có nghĩa rằng hệ thống vẫn hoạt động ngay cả khi có nhiều node bị hỏng. Khác với một hệ thống consistency, không có đảm bảo rằng phản hồi sẽ là thao tác write mới nhất.
- Partition tolerance: Khi một hệ thống phân tán gặp phải chia lớp, điều đó có nghĩa là có sự cắt đứt giao tiếp giữa các node. Nếu một hệ thống khả năng chống chia lớp, hệ thống không bị lỗi, bất kể các tin nhắn được thả hoặc bị trễ giữa các node trong hệ thống. Để đạt được khả năng chống chia lớp, hệ thống phải sao chép bản ghi qua các kết hợp node và network.
Định lý CAP và cơ sở dữ liệu NoSQL.

Cơ sở dữ liệu NoSQL rất phù hợp cho các mạng phân tán. Chúng cho phép mở rộng theo chiều ngang và có thể mở rộng nhanh chóng qua nhiều node. Khi quyết định sử dụng cơ sở dữ liệu NoSQL, cần lưu ý định lý CAP. Cơ sở dữ liệu NoSQL có thể được phân loại dựa trên hai tính năng CAP mà chúng hỗ trợ:
- Cơ sở dữ liệu CA: Cơ sở dữ liệu CA cho phép tính nhất quán và khả dụng trên tất cả các node trong mạng. Tuy nhiên, khi hệ thống gặp chia lớp, một số node có thể trở thành không khả dụng. Ví dụ về cơ sở dữ liệu CA là cơ sở dữ liệu quan hệ truyền thống như MySQL hoặc PostgreSQL.
- Cơ sở dữ liệu CP: Cơ sở dữ liệu CP đảm bảo tính nhất quán và khả năng chống chia lớp trong hệ thống. Khi gặp chia lớp, một số node có thể trở thành không khả dụng hoặc hoạt động chậm hơn. Ví dụ về cơ sở dữ liệu CP là Apache Cassandra.
Định lý CAP và microservices
Định lý CAP cũng có ảnh hưởng đến thiết kế kiến trúc microservices. Microservices là một mô hình phát triển phần mềm trong đó ứng dụng được xây dựng như một tập hợp các dịch vụ nhỏ, độc lập và có thể mở rộng. Mỗi dịch vụ micro được triển khai và quản lý riêng biệt. Khi thiết kế kiến trúc microservices, cần xem xét cân nhắc giữa tính nhất quán và khả dụng.
Ví dụ, nếu một yêu cầu từ một khách hàng cần tương tác với nhiều dịch vụ micro khác nhau, có thể xảy ra chia lớp mạng hoặc một số dịch vụ có thể bị lỗi. Trong trường hợp này, cần xác định xem tính nhất quán hay khả dụng là ưu tiên hàng đầu và thiết kế hệ thống phù hợp.
Tổng kết:
Định lý CAP là một khái niệm quan trọng trong thiết kế hệ thống phân tán. Nó xác định rằng một hệ thống phân tán chỉ có thể cung cấp đồng thời hai trong ba thuộc tính sau: tính nhất quán, khả dụng và khả năng chống chia lớp. Hiểu và áp dụng định lý CAP là rất quan trọng để xây dựng các hệ thống phân tán mạnh mẽ, cung cấp hiệu suất và độ tin cậy tốt.
Happy learning!
