이 시나리오에서 예외를 처리하는 가장 좋은 방법은 무엇입니까?

Harjinder Singh |

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Spring Boot에서 예외를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Completable 선물. 비즈니스 "예외"를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

C ++에서 대용량 데이터를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Combine에서 게시자의 오류를 처리하는 가장 좋은 방법은 무엇입니까? (CoreLocation에서 제목 업데이트 게시)

분류에서Dev

vuejs에서 Http Exception 오류 메시지를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

하나가 다른 것에 의존하는이 두 가지 비동기 메서드를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

모든 가능한 (선택되지 않은) 예외를 처리하는 것이 좋은 방법입니까?

분류에서Dev

이 시나리오에서 혼란스러운 루프를 피하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

봄 amqp SimpleMessageListenerContainer에서 예외를 처리하는 가장 좋은 전략은 무엇입니까?

분류에서Dev

이 PowerShell 코드에서 예외 처리를 추가하는 방법은 무엇입니까?

분류에서Dev

CouchDB Map / Reduce JavaScript 함수에서 Eclipse 오류를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Flask에서 웹훅 응답 시간 초과를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Dymos 운동 방정식에서 특이점을 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Laravel에서 빈 웅변 쿼리를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

앱 메모리에 이미지를 저장하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

optaplanner에서 각 이동 후 코드를 트리거하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

가져 오기를 처리하는 더 좋은 방법은 무엇입니까 *

분류에서Dev

JSON에서 키 이름 변경을 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

예외가있는 오류를 정확하게 찾아내는 가장 좋은 방법은 무엇입니까?

분류에서Dev

장기 실행 이벤트 리스너를 구현하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

동적으로 추가 된 열이 많은 데이터베이스를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

MVC C #에서이 시나리오를 처리하는 방법은 무엇입니까?

분류에서Dev

이벤트를 수신하고 트리거하는 요소 / 객체를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Flutter에서 화면 크기를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Rails Form Objects에서 날짜를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

SqlServer에서 교착 상태를 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Rails 앱에서 자연어 처리를 수행하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Django에서 양식의 임시 데이터를 저장하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

많은 열이있는 MySQLi에 데이터를 저장하는 가장 좋은 방법은 무엇입니까?

Related 관련 기사

  1. 1

    Spring Boot에서 예외를 처리하는 가장 좋은 방법은 무엇입니까?

  2. 2

    Completable 선물. 비즈니스 "예외"를 처리하는 가장 좋은 방법은 무엇입니까?

  3. 3

    C ++에서 대용량 데이터를 처리하는 가장 좋은 방법은 무엇입니까?

  4. 4

    Combine에서 게시자의 오류를 처리하는 가장 좋은 방법은 무엇입니까? (CoreLocation에서 제목 업데이트 게시)

  5. 5

    vuejs에서 Http Exception 오류 메시지를 처리하는 가장 좋은 방법은 무엇입니까?

  6. 6

    하나가 다른 것에 의존하는이 두 가지 비동기 메서드를 처리하는 가장 좋은 방법은 무엇입니까?

  7. 7

    모든 가능한 (선택되지 않은) 예외를 처리하는 것이 좋은 방법입니까?

  8. 8

    이 시나리오에서 혼란스러운 루프를 피하는 가장 좋은 방법은 무엇입니까?

  9. 9

    봄 amqp SimpleMessageListenerContainer에서 예외를 처리하는 가장 좋은 전략은 무엇입니까?

  10. 10

    이 PowerShell 코드에서 예외 처리를 추가하는 방법은 무엇입니까?

  11. 11

    CouchDB Map / Reduce JavaScript 함수에서 Eclipse 오류를 처리하는 가장 좋은 방법은 무엇입니까?

  12. 12

    Flask에서 웹훅 응답 시간 초과를 처리하는 가장 좋은 방법은 무엇입니까?

  13. 13

    Dymos 운동 방정식에서 특이점을 처리하는 가장 좋은 방법은 무엇입니까?

  14. 14

    Laravel에서 빈 웅변 쿼리를 처리하는 가장 좋은 방법은 무엇입니까?

  15. 15

    앱 메모리에 이미지를 저장하는 가장 좋은 방법은 무엇입니까?

  16. 16

    optaplanner에서 각 이동 후 코드를 트리거하는 가장 좋은 방법은 무엇입니까?

  17. 17

    가져 오기를 처리하는 더 좋은 방법은 무엇입니까 *

  18. 18

    JSON에서 키 이름 변경을 처리하는 가장 좋은 방법은 무엇입니까?

  19. 19

    예외가있는 오류를 정확하게 찾아내는 가장 좋은 방법은 무엇입니까?

  20. 20

    장기 실행 이벤트 리스너를 구현하는 가장 좋은 방법은 무엇입니까?

  21. 21

    동적으로 추가 된 열이 많은 데이터베이스를 처리하는 가장 좋은 방법은 무엇입니까?

  22. 22

    MVC C #에서이 시나리오를 처리하는 방법은 무엇입니까?

  23. 23

    이벤트를 수신하고 트리거하는 요소 / 객체를 처리하는 가장 좋은 방법은 무엇입니까?

  24. 24

    Flutter에서 화면 크기를 처리하는 가장 좋은 방법은 무엇입니까?

  25. 25

    Rails Form Objects에서 날짜를 처리하는 가장 좋은 방법은 무엇입니까?

  26. 26

    SqlServer에서 교착 상태를 처리하는 가장 좋은 방법은 무엇입니까?

  27. 27

    Rails 앱에서 자연어 처리를 수행하는 가장 좋은 방법은 무엇입니까?

  28. 28

    Django에서 양식의 임시 데이터를 저장하는 가장 좋은 방법은 무엇입니까?

  29. 29

    많은 열이있는 MySQLi에 데이터를 저장하는 가장 좋은 방법은 무엇입니까?

뜨겁다태그

보관