문제

이메일을 보내고 파일에 글을 쓰고 웹 서비스에 전화해야합니다. 일관성을 유지하려면 모든 단계가 발생해야합니다. 어떤 단계가 예외 또는 오류가 발생하면 모든 단계가 롤백해야합니다.

내 자신의 객체 산 엔진을 굴리기 전에 객체 수준에서 산 시맨틱을 구현하기위한 일반적으로 허용되는 패턴이 있습니까?

더 좋은 점은 .NET 플랫폼에 사용할 수있는 기존 라이브러리가 있습니까?

편집하다: 이메일을 보내는 것이 실행 취소 될 수는 없지만 SMTP 서버에 연결하지 않으면 전체 트랜잭션을 죽일 원인이됩니다. 또한 미래의 행동과 함께 사용하기에 확장 할 수 있기를 바랍니다.

도움이 되었습니까?

해결책

내가 이와 같은 것을 마지막으로 본 것은 몇 년 전이었습니다. 내가 기억하는 것은 명령 패턴을 사용하고 각 명령 객체를 큐에 저장하고 있다는 것입니다. 나는 그것이 Lifo 스택이라고 생각합니다.

따라서 "트랜잭션"에 실패하면 엔진이 명령 개체를 꺼내고 명령을 취소 한 다음 명령 개체를 파괴합니다. 스택이 비어있을 때까지 반복하십시오. "거래"가 성공하면 스택이 지워졌습니다.

불행히도, 나는 그 이상을 기억하지 못한다.

csla.net 비슷한 실행 취소 스택을 구현합니다. 그것이 내 머리 꼭대기를 생각할 수있는 코드가있는 유일한 예입니다.

다른 팁

Windows Workflow Foundation에는 개념이 있습니다 보상 (복합 활동 사용) 산성 시맨틱이 적절하지 않을 때.

좋은 질문은 왜 보상에 귀찮게 하는가? 자동 롤백과의 큰 산 거래가 좋지 않습니까? 산 트랜잭션은 동일한 데이터베이스 또는 동일한 정보 시스템 내에서 운영이 발생할 때 가장 적합합니다. 작업이 빠르게 끝나는 경우에도 가장 적합합니다. 다른 회사와 서비스가 참여할 때, 산성 의미론 측면에서 프로세스를 정의하는 것은 종종 어려운 일입니다. 고립되고 내구성이 뛰어나려면 작업 기간 동안 다른 회사의 모든 자원을 잠그십시오. 특히 작업이 길면 종종 불합리합니다. 일관되고 원자력이 되려면 임시 보상 코드가 필요합니다.

외부 라이브러리에 크게 의존하지 않고 가장 간단한 기술은 널리 퍼짐. 주기적으로 검문소 직렬화를 사용하여 상태의 스냅 샷을 사용하여 신문 데이터에 대한 모든 부작용 작업에 대한 충분한 정보를 직렬화하여 나중에 반복합니다. 무언가가 날아 가면 가장 최근의 체크 포인트를 다시로드 한 다음 해당 지점 이후에 작성된 모든 저널 레코드를 다시 적용하십시오.

더 정교한 것을 위해 시도하십시오 소프트웨어 트랜잭션 메모리. 현재 언어로 구현하는 것은 다소 서투른 일 수 있지만 매우 강력하며 추가 동시성 기술도 제공 할 수 있습니다.

웹 서비스에 액세스하거나 이메일 보내는 것과 같은 돌이킬 수없는 작업을 위해서는 사용해야합니다. 보상 거래: 다른 웹 서비스 호출을 통해 이전의 결과를 취소하거나 업데이트하거나, 의도 한대로 작동하지 않았 음을 수신자에게 조언하는 다른 이메일을 보내십시오.

전자 메일을 구할 수없고 파일을 작성하는 것이 비교적 저렴하기 때문에 적절한 순서로 그 일을 할 것입니다.

  1. 파일을 작성/파일을 작성하십시오. 누적이없는 경우 중지하십시오. 그렇지 않으면 계속하십시오.
  2. 웹 서비스에 전화하십시오. 실패한 경우 파일을 삭제하고 중지하십시오. 그렇지 않으면 계속하십시오.
  3. 전자 메일 보내기-전자 메일은 어쨌든 비동기식이므로 대부분의 전자 메일 서버가 오류가 발생하고 승인을받지 않으면 며칠 동안 재 시도로 설정되었으므로 전송되었는지 알 수 없습니다. 전자 메일이 그 경우에도 통과했습니다 ~였다 성공적인.

한 가지 아이디어는 JMS를 '엔진'으로 사용하는 것이며 JMS 트랜잭션 (기존 트랜잭션에 가입 할 수 있음)을 활용할 수 있습니다 (예 : DB 트랜잭션). 이것은 간단한 앱을 말하지 않는 한 비동기 이벤트 중심의 아키텍처로 이어지기 시작합니다.이 경우 질문을 할 필요가 없습니다.

이것의 예는 간단한 계정 생성입니다. 이를 위해 DB에 계정 정보를 지속하고 사용자에게 활성화를위한 이메일을 보내려고하지만 명백한 이유로 동일한 거래에서이를 원합니다.

전자 메일을 보낼 수 있지만 DB 트랜잭션 커밋이 어떤 이유로 든 실패 할 수 있으므로 거래 내에 이메일 보내는 코드를 넣어서는 안됩니다. 또한 이메일 발송이 고아 계정으로 이어지는 데 실패 할 수 있으므로 거래 후 (커밋 후) 전자 메일 전송을하지 않아야합니다.

이 시나리오에서 JMS를 사용하려면 JMS를 DB 트랜잭션 내에 보내고 해당 트랜잭션에 참여하도록하십시오. 당신은 보장 된 메시지 전달입니다. 다른 쪽 끝에는 대기열을 소비하는 것이 이메일을 보내는 것이 있습니다. 이메일 보내기 실패의 경우 최상의 옵션은 경고를 기록/제기하는 것입니다. JMS는 롤백을하고 나중에 소비하기 위해 메시지를 큐에 다시 넣습니다. 즉, 문제가 무엇이든 희망적으로 수정되면 이메일을 시도하고 재현하려고합니다.

중요한 것은 -DB 레코드가 일관성이 있고 이메일이 결국 전송된다는 것입니다.

두 가지 생각 :

또한 실험 프로젝트 stm .net 최근에 출시되었습니다. 이 프로젝트는 트랜잭션 메모리를 C#에 추가합니다. 실제로이를 지원하기 위해 CLR을 수정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top