Nói về khóa phân tán với hai levels lập trình backend

Nội dung bài viết

Video học lập trình mỗi ngày

"Khóa phân tán" là một phương pháp phổ biến được sử dụng để giải quyết "xung đột đồng thời" trong các ứng dụng phân tán hiện nay. Ở đây chúng ta sẽ phân tích các kịch bản và cách triển khai về phương pháp này.

Ở bài viết này tôi sẽ chia ra hai levels, một là những bạn mới tìm hiểu về lập trình backend và hai là những bạn đang làm về hệ thống backend trong một thời gian. Cho nên sẽ có trường hợp dễ và khó đối với hai level trên. Nhưng trước tiên, trước đây tôi có nói hai chủ đề liên quan đến bài viết này đó là "Cách xử lý tồn kho còn 1, nhưng khách hàng đặt hàng số lượng cao?" và thêm "Khóa phân tán (Optimistic và Pessimistic) HỆ THỐNG LỚN triển khai ở đâu? Sử dụng CODE như thế này!" nhưng có lẽ trong cơn say tôi lại nói ngược khà khà...

Tôi nghĩ nó sẽ sáng tỏ hơn trước khi bạn đọc bài viết này. Ngoài ra thì hiện tại tôi có phát triển một hệ thống backend eCommerce api sử dụng nhiều công nghệ cốt lõi hiện nay như, redis, mysql, mongodb, amazon service, rabbitMQ, elasticSearch... Nếu như anh chị có mục tiêu hướng đến con đường lập trình backend thì có thể đi cùng tôi, bạn cũng có thể xem 83 bài học ở trang chủ github của anonystick.

Còn bây giờ, chúng ta sẽ xem khái niệm mà tôi sẽ nói về "Khóa phân tán là gì?" với hai giải thích khác nhau mà tôi đã nói ở đầu bài viết.

Khóa phân tán là gì?

Dành cho level đầu tiên thì bạn hãy hình dung câu chuyện thế này để hiểu thực tế hơn. Tôi lấy một ví dụ sau.

Mỗi khách sạn có nhiều phòng, và mỗi phòng có một chìa khóa để vào, thì khi nhận phòng bạn cần phải xin khóa (chìa khóa) trước, nếu khóa (chìa khóa) bị người khác lấy mất thì bạn sẽ không thể sử dụng được phòng. Và khi bạn nhận được khóa thì bạn có thể sử dụng những tài nguyên (tủ lạnh, máy giặt...) ở trong đó. Có nghĩa là khi bạn đang sử dụng thì, không ai có thể sử dụng cùng một lúc tài nguyên với bạn. Khi bạn sử dụng xong thì những người khác sẽ lấy lại khóa đó và sử dụng tiếp theo.

Ví dụ thứ hai đề cập tròng eCommerce Backend Api, đó là giả sử có 100 người dùng tham gia sự kiện flash sale trong thời gian cho trước được diễn ra, hệ thống cho phép mỗi user mua một productquanity lớn nhất cho mỗi đợt mua đó là 3. Nếu chúng ta không hiểu và áp dụng khóa phân tán thì kho hàng của sản phẩm (tài nguyên) sẽ xảy ra những tình huống sau:

Mỗi user là một luồng thì 100 users đại diện cho 100 threads (luồng) khác nhau. Cùng một thời gian mở bán lúc 12h thì 100 threads này sẽ truy cập vào hệ thống và mua hàng. Ở đây, tôi ví dụ tiếp.

User 1 đi xuống hạ tầng backend và truy vấn số lượng kho còn hàng hay không? Thì user 1 phát hiện rằng, kho hàng còn 1 sản phẩm trong kho cho nên quy trình mua hàng tiếp tục diễn ra, suy ra nó hợp lệ. Tiếp...

User 2 cũng như vậy đi xuống hạ tầng backend và truy vấn số lượng kho còn hàng hay không? Thì user 2 phát hiện rằng, kho hàng còn 1 sản phẩm trong kho cho nên quy trình mua hàng tiếp tục diễn ra, suy ra nó hợp lệ. Tiếp theo là gì?

User 100 cũng như vậy? nghĩa là cứ mỗi user tiếp tục thực hiện và giảm số lượng hàng tồn kho xuống 1 và trả về thành công. Lúc này xảy ra sự cố bán quá mức khiến thêm một bản sản phẩm được bán ra, một sản phẩm mà bán cho nhiều users?

Chính vì vậy thì để đảm bảo tài nguyên dùng chung được truy cập an toàn, chúng ta cần sử dụng các hoạt động loại trừ lẫn nhau để bảo vệ tài nguyên dùng chung, nghĩa là chỉ một luồng được phép truy cập tài nguyên dùng chung cùng một lúc và các luồng khác cần đợi luồng hiện tại sẽ được phát hành trước khi họ có thể truy cập. Điều này có thể tránh được sự cạnh tranh dữ liệu và các vấn đề về dữ liệu bẩn, đồng thời đảm bảo tính chính xác và ổn định của chương trình.

Tiếp theo tôi sẽ giải thích sâu hơn dành cho level tiếp theo như sau:

Khóa phân tán là một phương tiện kiểm soát quyền truy cập loại trừ lẫn nhau vào các tài nguyên được chia sẻ trong các hệ thống phân tán (tài nguyên được chia sẻ giữa các tiến trình) để tránh các kết quả không thể kiểm soát được do truy cập song song bởi nhiều luồng. Nguyên tắc triển khai cơ bản giống như nguyên tắc của khóa một quy trình. Tính duy nhất được xác định thông qua mã định danh dùng chung. Khi mã định danh dùng chung được sửa đổi, tính nguyên tử và khả năng hiển thị đối với người gọi dịch vụ khóa có thể được đảm bảo. Do môi trường phân tán cần xem xét các yếu tố bất thường khác nhau nên mức độ phức tạp nhất định được đưa ra để triển khai dịch vụ khóa phân tán đáng tin cậy.

Vì bạn là một BE chuyên sâu nên ở đây tôi không nói nhiều. Nếu bạn muốn tìm hiểu thêm thì ở đầu bài viết tôi có đề cập về quy trình backend.

thanks!

Có thể bạn đã bị missing