Tóm tắt bài báo: Sagas

Feb 16 2023
H. Garcia-Molina và K.
Ảnh của Nathan Riley trên Bapt

H. Garcia-Molina và K. Salem. 1987. Truyện cổ tích . Trong Kỷ yếu của hội nghị quốc tế ACM SIGMOD năm 1987 về quản lý dữ liệu (SIGMOD '87). Hiệp hội Máy tính, New York, NY, USA, 249–259.

Từ khóa: Quy trình chạy dài, Sagas, Giao dịch, Bồi thường, Giảm thiểu sai sót, Chịu đựng sai sót, Tính minh bạch của sai sót

Mặc dù bài báo gốc về Sagas đã được viết cách đây 35 năm, nhưng vấn đề vẫn còn liên quan đến ngày nay. Bài đăng này khám phá nguồn gốc của khái niệm Sagas, các quy trình chạy dài kéo dài nhiều giao dịch cơ sở dữ liệu.

Giới thiệu

Trong bài báo Sagas của họ, Hector Garcia-Molina và Kenneth Salem giới thiệu khái niệm sagas để thực hiện các hoạt động “dài hạn”.

Molina và Salem đề cập đến các quy trình bao gồm một bước duy nhất là các quy trình “chạy ngắn” hoặc “sống trong thời gian ngắn” và các quy trình bao gồm nhiều bước là “chạy dài” hoặc “tồn tại lâu dài”. Do đó, short-running hay long-running không phải là một phát biểu về thời gian vật lý mà là một phát biểu về thời gian logic với mỗi bước là một tích tắc của đồng hồ (Hình 1).

Hình 1 Ngắn hạn & Dài hạn

Vấn đề

Trong một hệ sinh thái phần lớn từ chối ý tưởng về các giao dịch phân tán hoặc giữ khóa trong một khoảng thời gian dài, bất kỳ quy trình chạy dài nào cũng không thể được ánh xạ đơn giản tới một giao dịch phân tán, chạy dài. Thay vào đó, chúng ta cần một cơ chế khác để tổng hợp các quy trình dài hạn từ các giao dịch ngắn hạn, không phân tán.

Bài báo định nghĩa một quy trình P là một chuỗi các bước a, b, v.v., trong đó mỗi bước là một giao dịch cơ sở dữ liệu. Để sử dụng các thuật ngữ quen thuộc hơn, bạn có thể coi một quy trình là một chức năng và trình tự các bước là một chuỗi các lệnh gọi API đến cơ sở dữ liệu.

Chúng tôi đề cập đến trình tự các bước a, b, v.v. như một dấu vết:

trace(P) = a • b • …

Nói cách khác: Một chuỗi hai giao dịch không phải là một giao dịch!

Hình 2. Thành phần tuần tự của hai giao dịch không phải là một giao dịch.

Thông thường, nếu một quy trình bao gồm một giao dịch đơn lẻ, thì quy trình đó thể hiện sự đảm bảo về tính nguyên tử của một giao dịch (Hình 3).

Hình 3. Một quy trình P bao gồm một bước a

Tuy nhiên, nếu một quy trình bao gồm nhiều giao dịch, thì quy trình đó không thể hiện sự đảm bảo về tính nguyên tử của một giao dịch: Quy trình có thể thực thi một phần (Hình 4).

Hình 4. Một quy trình P gồm hai bước a và b

Tuy nhiên, không giống như các giao dịch khác, các giao dịch của một quy trình có liên quan và phải được thực thi như một đơn vị, bất kỳ việc thực thi một phần nào của quy trình đều là điều không mong muốn.

Bài báo thảo luận về một ứng dụng đặt chỗ du lịch, trong đó một chuyến đi bao gồm nhiều chuyến bay có khả năng trên các hãng hàng không khác nhau. Ở đây, đặt một chuyến đi liên quan đến nhiều giao dịch, một giao dịch cho mỗi chặng của chuyến đi. Là khách du lịch, chúng tôi muốn tất cả các giao dịch được thực hiện như một đơn vị: Chúng tôi muốn đặt tất cả các chuyến bay hoặc không có chuyến bay nào, việc đặt một số chuyến bay là không thể chấp nhận được.

Giải pháp

Bài báo giới thiệu Sagas, một giao thức để thực hiện các quy trình chạy dài. Giao thức Saga đảm bảo rằng một quy trình là nguyên tử, nghĩa là một quy trình thực thi có thể quan sát được tương đương với hoàn toàn hoặc hoàn toàn không.

Hình 5. Phục hồi tiến và lùi

Để giảm thiểu việc thực thi một phần, một quy trình có thể thực hiện khôi phục tiến hoặc lùi [2]:

Phục hồi chuyển tiếp

Phục hồi lỗi chuyển tiếp đề cập đến các chiến lược giảm thiểu lỗi giúp chuyển hệ thống từ trạng thái trung gian sang trạng thái tương đương với trạng thái cuối cùng (di chuyển quy trình về phía trước).

Phục hồi ngược

Khôi phục lỗi ngược đề cập đến các chiến lược giảm thiểu lỗi giúp chuyển hệ thống từ trạng thái trung gian sang trạng thái tương đương với trạng thái ban đầu (di chuyển quy trình về phía sau).

Thu hồi & Bồi thường ngược

Để cho phép khôi phục ngược, mỗi quy trình phải đăng ký một bước bù cho mỗi bước (Hình 6).

Hình 6. Giao dịch sᵢ & Bồi thường cᵢ

Bước bù hoàn tác — từ quan điểm ngữ nghĩa — bước, nhưng không nhất thiết trả cơ sở dữ liệu về trạng thái tồn tại khi bước bắt đầu. Bồi thường sẽ khôi phục thế giới về trạng thái gần đúng có thể chấp nhận được so với trạng thái trước khi bắt đầu giao dịch.

Ví dụ: quay lại ứng dụng đặt chỗ du lịch, nếu một chuyến đi bao gồm hai chuyến bay và đặt trước chuyến bay đầu tiên thành công nhưng đặt trước chuyến bay thứ hai không thành công, saga cần hủy đặt chỗ đầu tiên để trả lại cơ sở dữ liệu về trạng thái gần đúng có thể chấp nhận được. nó đã có trước khi bắt đầu đặt chuyến đi.

Chấp hành

Vì vậy, trong trường hợp không có lỗi, một quy trình P tạo ra dấu vết mong muốn

trace(P) = s₁ • s₂ • … sₙ • ✔️

trace(P) = s₁ • s₂ • … sᵢ • × • cᵢ … • c₂ • c₁ • ✔️

Khi lỗi làm gián đoạn Saga, Saga phải có khả năng khôi phục trạng thái hiện tại và thực hiện khôi phục tiến hoặc lùi. Do đó, một Saga phải có khả năng ghi lại phần đầu của một Saga, phần kết thúc của một Saga cũng như ghi lại các điểm kiểm tra và phần bù.

Nếu bạn sở hữu cơ sở dữ liệu, bạn có thể ghi lại các điểm kiểm tra và các khoản bồi thường theo giao dịch với mỗi bước. Nếu bạn không thể ghi lại các điểm kiểm tra và các khoản bù theo giao dịch với từng bước, thì bạn phải nghĩ ra một cơ chế để ghi lại các khoản bù các điểm kiểm tra một cách đáng tin cậy.

Cuộc thảo luận

Mặc dù bài báo đã được viết cách đây hơn 35 năm, nhưng vấn đề và Sagas với tư cách là giải pháp được đề xuất vẫn còn phù hợp cho đến ngày nay. Tuy nhiên, sự chú ý đã chuyển từ soạn thảo các giao dịch cơ sở dữ liệu sang soạn thảo các yêu cầu dịch vụ.

Hãy nhớ rằng các dịch vụ không thể hiện các thuộc tính giao dịch: Dịch vụ có thể không nguyên tử, sau khi gọi dịch vụ và nếu dịch vụ gặp sự cố, bạn có thể không biết liệu dịch vụ có hiệu lực hay không.

Do đó, bạn nên đăng ký một hành động bù trước khi gọi một dịch vụ và thiết kế logic bù cho chính xác cho dù dịch vụ có hiệu lực hay không.

Phần kết luận

Sagas vẫn có liên quan, bất chấp những tiến bộ đáng kể trong lý thuyết và thực hành kể từ khi xuất bản bài báo. Khái niệm cơ bản về Saga như một giao thức để triển khai tính nguyên tử trong môi trường phân tán giữa các giao dịch hoặc dịch vụ, các kỹ thuật được mô tả trong bài báo tiếp tục được sử dụng rộng rãi cho đến ngày nay.

Người giới thiệu