트랜잭션을 사용할 수없는 경우 어떻게 엔터프라이즈 환경에서 웹 서비스를 효과적으로 사용할 수 있습니까?


14

내가 일하고있는 곳은 몇 가지 기본 규칙을 세우려고 노력하고 있으며 현재 우리가 겪고있는 논쟁은 코드 재사용을위한 로컬 라이브러리 대 웹 서비스입니다. 웹 서비스는 대부분의 회사에서 인기있는 것으로 보이며, 여기에서 대부분의 개발자가 기대하는 것입니다.

심각한 작업에 웹 서비스를 효과적으로 사용하는 방법을 알 수 없습니다. 트랜잭션을 사용할 수없는 경우 어떻게 여러 서비스 호출을 안전하게 실행할 수 있습니까?

알림을 받아야하는 특정 조건을 충족하는 데이터베이스에서 고객을 확보하는 크론 작업이 있다고 가정하겠습니다. 팩스, 이메일이 발송되고 내부적으로 문제를 추적하기 위해 티켓이 생성됩니다. 이는 for 루프에서 각 고객에 대해 발생하는 3 가지 서비스 호출입니다.

예를 들어, 팩스 및 전자 메일이 고객에게 전송되지만 티켓이 생성되지 않는 등의 오류가 발생할 수 있습니다. 또는이 크론 작업에 버그가 포함되어 매번 같은 시점에 실패하고 동일한 고객에게 반복적으로 이메일을 보냅니다. 라이브러리가 모두 로컬 인 경우 모든 것이 트랜잭션으로 랩핑 될 수 있으며 그 중 어느 것도 발생하지 않습니다. 그러나이 예제에서는 웹 서비스를 사용하고 있습니다.

이메일 및 팩스 방법은 실제로 데이터를 데이터베이스 지원 큐 테이블에 삽입하며,이 테이블은 별도의 cron 작업 프로세스에 의해 처리됩니다. 따라서 "이메일 보내기"및 "팩스 보내기"서비스 방법에 대한 호출은 필요한 경우 부작용없이 중단 될 수 있습니다.

옵션은이 전체 코드를 웹 서비스 자체에 넣는 것이므로 웹 서비스 자체는 트랜잭션에서 이메일, 팩스 및 티켓 작성 메소드를 호출합니다. 그러나 우리는 트랜잭션 사용을위한 웹 서비스 방법을 만들고 있습니다. 우리가 실제로이 하나의 cron 스크립트를 제외하고 어디에서나이 메소드를 호출해야 할 정당한 이유는 없습니다.

이 방법을 일반적으로 어떻게 처리 하시겠습니까?


완전한 답변을 제공하려면 더 많은 정보가 필요합니다. 서비스 기반 아키텍처로 전환 할 때 고려해야 할 사항이 많이 있습니다. 예를 들어, 이기종 (다른 언어 및 플랫폼) 또는 동종 (단일 언어 및 플랫폼) 환경이 있습니까? 서비스 버스 시스템이 있습니까? 그렇지 않은 경우 구현할 계획입니까? 서비스 액세스 방법 (단일 위치 인트라넷, 다중 위치 완, 분산 클라이언트가 공용 서비스 API에 도달) "최적의"솔루션에 영향을주는 여러 변수가 있습니다.
Michael Brown

@ MikeBrown : 서비스는 모두 하나의 언어로 작성되지만 여러 플랫폼에서 사용됩니다. EBS 구현에 대해 전혀 모릅니다. 어떤 종류의 서비스 작업도 시작하지 않았으므로 모든 것이 가능합니다. 서비스는 대부분 로컬 네트워크를 통해 내부적으로 소비되지만 모바일 애플리케이션을 위해 공개해야하는 서비스도 있습니다.
ryeguy

"라이브러리가 모두 로컬 인 경우 모든 것이 트랜잭션으로 래핑 될 수 있으며 그 중 어느 것도 발생하지 않습니다." 그릇된. 이메일이 전송 된 최종 데이터베이스 업데이트 전에 오류가 발생할 수 있습니다 . 거래가 소급하여 이메일이나 팩스를 막지 못합니다.
S.Lott

@ S.Lott : 이메일 및 팩스 서비스 호출이 실제로 다른 프로세스에 의해 전달되는 대기열에 삽입하기 때문입니다. 위에서 설명한 트랜잭션이 발생하면 큐 삽입이 중단됩니다.
ryeguy

1
@ryeguy : 질문을 업데이트 하십시오. 질문에 의견을 추가하지 마십시오. 이것은 아키텍처에서 중요한 부분입니다. 질문에 공개하십시오.
S.Lott

답변:


5

실제로 설명하는 것은 2 단계 커밋을 구현 하는 분산 트랜잭션 입니다. 일부 엔터프라이즈 메시징 플랫폼에는 이러한 종류의 기능을 지원하기 위해 트랜잭션 관리자가 포함되어 있지만 구체적인 제품은 플랫폼 / 언어에 따라 다릅니다. 그러한 도구에 대한 구체적인 경험이 없지만이 포인터가 도움이되기를 바랍니다.


3

이 특정 Q & A에 참여하면서 DDD / CQRS 메일 링리스트에 참여하는 여러 플랫폼을 지원하는 서비스에 대한 유사한 스레드가 있다는 점이 흥미 롭습니다. 여기에서 조언을 반복 할 수 있습니다.

이기종 환경에서 트랜잭션을 지원하기위한 한 가지 옵션은 트랜잭션을 지원하는 전송 메커니즘을 사용하는 것이며 트랜잭션이 사용될 모든 플랫폼에서 지원됩니다. 고급 메시지 큐 프로토콜 (AMQP)는 트랜잭션을 지원하지 오늘날 일반적으로 사용되는 거의 모든 언어에 대한 네이티브 API가있다. RabbitMQ 는 AMQP를 구현하고 강력한 솔루션으로 업계에서 검증 된 서버입니다.

RabbitMQ 기반 시스템을 활용하면 확장해야하는 ESB 전체를 활용할 수 있습니다. 채널에 메시지를 게시하고 큐에 가입합니다. 그것이 정말로 강력 해지는 곳은 채널과 대기열 사이의 것입니다. 많은 흥미로운 일을 수행 할 수 있습니다. 채널은 여러 채널에 의해 큐를 공급할 수있는 여러 큐 (pub / sub)를 공급할 수 있으며 컨텐츠 등에 따라 다른 큐로 메시지를 라우팅 할 수 있습니다.

방금 트랜잭션 대안 (오버 헤드와 함께 제공되고 비동기 작업을 차단 op로 전환)에 대해 읽었습니다. RabbitMQ는 게시자 확인을 지원합니다 . 기본적으로 실패한 트랜잭션을 처리하기 위해 게시 된 메소드에 대한 콜백을 등록 할 수 있습니다. 귀하의 경우 이메일 / 팩스 요청을 취소하고 티켓을 삭제할 수 있습니다.

물론 토끼 구멍 (장난감 용서)은 거기에서 더 깊어집니다. Rabbit을 사용하여 내부 및 외부 웹 서비스 모두에서 복잡한 오케스트레이션을 수행 할 수 있습니다.

대중을 대상으로하는 웹 서비스의 경우 간단 해집니다. 서비스 (SOAP, REST 또는 JSON)는 적절한 서비스 큐에 메시지를 게시하고 내부 시스템에서 메시지를 처리하도록합니다.

정보를 신속하게 다시 기대하는 시나리오에 대한 요청 / 응답 메시지를 작성하는 기능도 있습니다.


2

찾고있는 키워드는 '웹 서비스 안무'입니다.

확인 위키 백과 그것에 대해의 기사를.


때때로 "오케스트레이션"이라고도합니다.
S.Lott

1

내가 작성한 서비스 앱에서 이것을 처리하는 방법은 필요한 트랜잭션을 처리하기 위해 래퍼를 만드는 것입니다. 필자의 경우 웹 사이트, 데스크톱 응용 프로그램 또는 Windows 서비스로 만든 사용자 요청은 웹 서비스를 쿼리해야했으며 결과와 사용자 옵션에 따라 로컬 DB 및 선택적으로 원격 DB를 업데이트해야했습니다. 웹 서비스를 통해. 그런 다음 보고서를 생성하여 즉시 반환, 이메일 및 / 또는 팩스로 보내야했습니다. 로컬 DB, 전자 메일 및 보고서 생성을 제어했지만 웹 서비스 또는 팩스 서버에서는 아무것도 제어하지 못했습니다.

랩퍼를 작성하면 더 나은 트랜잭션 제어 및 오류 처리가 가능합니다. 또한 외부 소스의 내부 네트워크 서비스에 대한 액세스를 제어하여 보안을 강화했습니다. 일반적으로 코드가 올바르게 재사용되는 한 cut-n-paste 코딩이없는 한 단일 솔루션에 적합한 랩퍼를 작성하는 유효한 이유로 서비스 트랜잭션 및 서비스 관리가 필요하다고 생각합니다.


1

심각한 작업에 웹 서비스를 효과적으로 사용하는 방법을 알 수 없습니다. 트랜잭션을 사용할 수없는 경우 어떻게 여러 서비스 호출을 안전하게 실행할 수 있습니까?

당신은 할 수 없습니다.

웹 서비스 프레임 워크 X를 사용하여 트랜잭션을 어떻게 구현합니까? 지금은 불가능하다고 가정하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.