논문 요약: Sagas
H. Garcia-Molina 및 K. Salem. 1987. 무용담 . 데이터 관리에 관한 1987년 ACM SIGMOD 국제 회의 진행(SIGMOD '87). 컴퓨팅 기계 협회, 뉴욕, 뉴욕, 미국, 249–259.
키워드: 장기 실행 프로세스, Saga, 트랜잭션, 보상, 장애 완화, 장애 허용, 장애 투명성
Sagas에 대한 최초의 논문은 35년 전에 작성되었지만 오늘날에도 문제는 여전히 관련이 있습니다. 이 게시물은 여러 데이터베이스 트랜잭션에 걸쳐 있는 장기 실행 프로세스인 Sagas 개념의 기원을 탐구합니다.
소개
논문 Sagas 에서 Hector Garcia-Molina와 Kenneth Salem은 "장기 실행" 작업을 구현하기 위해 saga의 개념을 소개합니다.
Molina와 Salem은 단일 단계로 구성된 프로세스를 "단기 실행" 또는 "단기" 프로세스로, 여러 단계로 구성된 프로세스를 "장기 실행" 또는 "장기" 프로세스로 지칭합니다. 따라서 단기 실행 또는 장기 실행은 물리적 시간에 대한 설명이 아니라 각 단계가 클럭 틱인 논리적 시간에 대한 설명입니다(그림 1).
문제
분산 트랜잭션이나 오랜 기간 동안 잠금을 유지하는 개념을 대체로 거부하는 생태계에서 장기 실행 프로세스는 단순히 장기 실행 분산 트랜잭션에 매핑될 수 없습니다. 대신 단기 실행 비분산 트랜잭션에서 장기 실행 프로세스를 구성하는 다른 메커니즘이 필요합니다.
이 논문은 프로세스 P를 일련의 단계 a, b 등으로 정의하며 각 단계는 데이터베이스 트랜잭션입니다. 보다 친숙한 용어를 사용하려면 프로세스를 함수로, 일련의 단계를 데이터베이스에 대한 일련의 API 호출로 생각할 수 있습니다.
단계 a, b 등의 순서를 추적이라고 합니다.
trace(P) = a • b • …
즉, 일련의 두 트랜잭션은 트랜잭션이 아닙니다!
간단하게 프로세스가 단일 트랜잭션으로 구성되어 있으면 프로세스는 트랜잭션의 원자성 보장을 나타냅니다(그림 3).
그러나 프로세스가 여러 트랜잭션으로 구성된 경우 프로세스는 트랜잭션의 원자성 보장을 나타내지 않습니다. 프로세스가 부분적으로 실행될 수 있습니다(그림 4).
그러나 다른 트랜잭션과 달리 프로세스의 트랜잭션은 서로 관련되어 있고 하나의 단위로 실행되어야 하므로 프로세스의 부분적인 실행은 바람직하지 않습니다.
이 백서는 여행이 잠재적으로 다른 항공사의 여러 항공편으로 구성되는 여행 예약 응용 프로그램에 대해 설명합니다. 여기에서 여행 예약에는 여행 구간당 하나씩 여러 트랜잭션이 포함됩니다. 여행자로서 우리는 모든 거래가 하나의 단위로 실행되기를 원합니다. 모든 항공편을 예약하거나 항공편을 예약하지 않거나 일부 항공편을 예약하는 것은 허용되지 않습니다.
해결책
이 백서에서는 장기 실행 프로세스를 구현하기 위한 프로토콜인 Sagas를 소개합니다. Saga 프로토콜은 프로세스가 원자적임을 보장합니다. 즉, 프로세스가 완전히 또는 전혀 실행되지 않는 것과 눈에 띄게 동일하게 실행됩니다.
부분 실행을 완화하기 위해 프로세스는 정방향 또는 역방향 복구를 구현할 수 있습니다[2].
앞으로 복구
순방향 장애 복구는 시스템을 중간 상태에서 최종 상태와 동등한 상태(프로세스를 앞으로 이동)로 전환하는 장애 완화 전략을 나타냅니다.
역방향 복구
역방향 장애 복구는 시스템을 중간 상태에서 초기 상태와 동등한 상태(프로세스를 뒤로 이동)로 전환하는 장애 완화 전략을 나타냅니다.
후방 복구 및 보상
역방향 복구를 가능하게 하려면 각 프로세스는 각 단계에 대한 보상 단계를 등록해야 합니다(그림 6).
보상 단계는 의미론적 관점에서 단계를 실행 취소하지만 반드시 단계가 시작되었을 때 존재했던 상태로 데이터베이스를 반환하지는 않습니다. 보상은 거래 시작 전의 상태에 대한 수용 가능한 근사치인 상태로 세계를 복원합니다.
예를 들어, 여행 예약 애플리케이션으로 돌아가서 여행이 두 개의 항공편으로 구성되고 첫 번째 항공편 예약은 성공했지만 두 번째 항공편 예약은 실패한 경우 saga는 첫 번째 예약을 취소하여 데이터베이스를 상태에 대한 허용 가능한 근사치로 되돌려야 합니다. 그것은 여행 예약을 시작하기 전에 있었다.
실행
따라서 실패가 없는 경우 프로세스 P는 원하는 추적을 생성합니다 .
trace(P) = s₁ • s₂ • … sₙ • ✔️
trace(P) = s₁ • s₂ • … sᵢ • × • cᵢ … • c₂ • c₁ • ✔️
실패로 인해 Saga가 중단되면 Saga는 현재 상태를 복구하고 정방향 또는 역방향 복구를 수행할 수 있어야 합니다. 따라서 Saga는 Saga의 시작과 Saga의 완성, 체크 포인트와 보상을 기록할 수 있어야 합니다.
데이터베이스를 소유하고 있는 경우 각 단계에서 체크포인트와 보상을 트랜잭션으로 기록할 수 있습니다. 각 단계마다 체크포인트와 보상을 트랜잭션적으로 기록할 수 없다면 체크포인트 보상을 안정적으로 기록할 수 있는 메커니즘을 고안해야 합니다.
논의
이 논문은 35년 전에 작성되었지만 제안된 솔루션으로서의 문제와 Sagas는 오늘날에도 여전히 관련이 있습니다. 그러나 관심은 데이터베이스 트랜잭션 구성에서 서비스 호출 구성으로 이동했습니다.
서비스는 트랜잭션 속성을 나타내지 않는다는 점에 유의하십시오. 서비스 호출 후 서비스는 원자적이지 않을 수 있으며 서비스가 충돌하는 경우 서비스가 적용되었는지 여부를 알 수 없습니다.
따라서 서비스를 호출하기 전에 보상 조치를 등록 하고 서비스 적용 여부에 상관없이 보상 논리를 올바르게 설계해야 합니다.
결론
Sagas는 논문 출판 이후 이론과 실제의 상당한 발전에도 불구하고 여전히 관련성이 있습니다. 트랜잭션 또는 서비스 전반에 걸친 분산 환경에서 원자성을 구현하기 위한 프로토콜로서의 Saga의 기본 개념은 오늘날에도 계속해서 널리 사용되고 있습니다.
참조
- [1] 장기 실행 트랜잭션의 추적 의미 체계, M. Butler, CAR Hoare & C. Ferreira, 2005
- [2] 첫 번째 원칙의 실패 처리 , Dominik Tornow, 2022

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































