DB에 레코드를 생성하고 파일을 위치에 업로드하기 위해 멀티 파트 형식의 데이터를 가져 오는 C # WEB API를 작성 중입니다. 생성의 일부로 Jira 이슈를 생성하고 생성 된 레코드를 JIRA 세부 정보로 업데이트하고 있습니다.
[Route("api/request/create")]
[Consumes("multipart/form-data")]
public async Task<HttpResponseMessage> CreateRequest()
{
try
{
var multipartMemoryStream = await Request.Content.ReadAsMultipartAsync();
var newRequestData = await multipartMemoryStream.Contents[0].ReadAsStringAsync();
CreateRequestCommand createRequestCommand = JsonConvert.DeserializeObject<CreateRequestCommand>(newRequestData);
var requestId = CreateRequestInDB(createRequestCommand)
var jira = await CreateJira(createContentRequestCommand);
await WriteSourceFiles(multipartMemoryStream.Contents);
await UpdateRequestWithJiraDetails(requestId, jira);
return new SuccessResponse(requestId)
}
catch (Exception ex)
{
throw ex;
}
}
이것은 대부분의 경우 잘 작동합니다. 방법 중 하나라도 실패하면 시스템이 DB에 레코드를 유지하지 않고 JIRA 문제도 삭제하지 않도록 예외를 가장 좋은 방법으로 처리하는 방법은 무엇입니까? 단계 중 하나가 실패 할 경우 시스템을 일관된 상태로 유지하기위한 최상의 전략은 무엇입니까?
분산 트랜잭션 의 정의에 대해 WikiPedia를 보면 다음과 같이 표시됩니다.
분산 트랜잭션은 둘 이상의 네트워크 호스트가 관련된 데이터베이스 트랜잭션입니다. 일반적으로 호스트는 트랜잭션 리소스를 제공하는 반면 트랜잭션 관리자는 이러한 리소스에 대한 모든 작업을 포함하는 전역 트랜잭션을 만들고 관리합니다. 다른 트랜잭션과 마찬가지로 분산 트랜잭션에는 4 개의 ACID (원 자성, 일관성, 격리, 내구성) 속성이 모두 있어야합니다. 여기서 원자 성은 작업 단위 (작업 번들)에 대한 결과를 전부 또는 전혀 보장하지 않습니다.
정의가 데이터베이스 관련성에 초점을 맞추더라도 데이터베이스와 파일을 작업 단위로 작성하려는 경우에도 샘플이 적용됩니다. 둘 중 하나가 실패하면 둘 다 롤백해야합니다.
.NET이 Windows 운영 체제에서만 실행될 수 있었던 당시에는 .NET이 트랜잭션 관리자를 활용할 수있었습니다 . 2 단계 커밋을위한 인터페이스 를 구현 하기 IEnlistmentNotification
만하면됩니다. 이 인터페이스는 4 가지 메소드를 제공 합니다 .
Prepare
투표 용Commit
행복한 길을 위해Rollback
불행한 길을 위해InDoubt
두 번째 단계 동안마지막으로 다음 호출을 통해 해당 표현을 TransactionManager에 등록해야했습니다. Transaction.Current.EnlistVolatile
.NET Core는 분산 트랜잭션을 지원하지 않습니다 . 아마도 .NET 5 ...
2 단계 커밋 (및 3PC) 프로토콜에는 차단 문제가 있습니다 ( 1 , 2 , 3 ) 멈춰서 계속 진행할 수없는 상황이있을 수 있습니다. Martin Kleppmann의 Designing Data-Intensive Applications 책은 정말 쉽게 소비 할 수있는 방식으로 문제를 자세히 설명합니다.
마이크로 서비스의 말에서 권장되는 접근 방식은 Sagas 패턴 입니다. 모든 ACID 보증이있는 지역 거래가 있습니다. 참가자들 사이에 일종의 조정이 필요합니다. 전체 흐름을 수행하는 오케 스트레이터가있을 수 있으며 참가자는 서로에 대해 알지 못합니다. 또는 참가자는 각 참가자가 이전 및 다음 참가자와 의사 소통하는 방법을 알고있는 안무를 구성 할 수 있습니다.
실패한 경우 롤백하거나 보상 조치를 적용하여 이전 조치의 효과를 취소 할 수 있습니다. 이 모든 것이 자세히 설명되어있는 몇 가지 정말 좋은 리소스가 있습니다. 나는 추천 크리스 리처드슨의 Microservices 패턴의 책을. 온라인으로 시작하려면 이 기사를 읽어보십시오 .
실제 사례를 살펴보고 싶다면 Jimmy Bogard의 훌륭한 블로그 시리즈 를 읽어 보시기 바랍니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다