2013-03-26 4 views
2

내가 직면 한 디자인 문제를 처리하는 방법에 대한 아이디어를 얻을 수 있는지 궁금합니다. 간단히하기 위해 Tomcat에서 3 개의 다른 시스템/jvms에서 3 개의 엔드 포인트를 실행한다고 가정 해 봅시다. 엔드 포인트는 다음과 같은 책임이 있습니다분산 트랜잭션 Java JMS

엔드 포인트 1 - 수요 데이터를 받아 순서로이 데이터가

끝점 2 요청 변환은 - 주문 요청에 소요되는 순서를 저장하고 주문

엔드 포인트를 반환 3 - 주문을 가져 와서 특정 공급 업체의 xml 형식으로 변환하여 대기열로 보냅니다.

편집 :이 엔드 포인트는 REST를 통해 다른 클라이언트에 대한 현재 서비스로 존재합니다. JTA Transaction Manager에 Atomikos를 사용할 수있는 옵션이 있으며 우리는 ActiveMQ를 사용하고 있습니다.

이렇게 말하면서 필자는 요청 데이터 메시지를받는 큐 설정을 가지고 있습니다. 수신 된 각 수요 데이터 메시지에 대해 본질적으로 XA를 통해 하나의 작업 단위에있는 3 개의 엔드 포인트 각각을 통해 퍼널을 수행하려고합니다. 필자는 3 종점 각각을 완벽하게 제어 할 수 있으므로 어떤 통신 프로토콜을 사용할 수있는 유연성이 어느 정도 있습니다. 또한 결국에는 매일 약 500 ~ 1 백만 건의 메시지가 들어올 것입니다. 분산 트랜잭션에서이 엔드 포인트를 함께 묶기 위해 어떤 통신 프로토콜을 사용합니까?

나는 Camel에 대한 몇 가지 경험을 가지고 있지만, 한 가지 작업 단위로 묶는 방법에 대해 꼼짝 못하게하고 있습니다. RMI는 본질적으로 동기적인 것처럼 보이므로 JMS보다 적절합니까? 제공된 모든 도움에 대해 미리 감사드립니다. fusesource에서 the Apache Camel documentation에서

+0

이 트랜잭션은 얼마나 오래 실행되어야합니까? 얼마나 자주 롤백해야합니까? – flup

+0

내 견지에서 말하면 의미가 없습니다. 나는 물건을 분리하고 비동기 적 접근법을 취하고 다른 한편으로는 단계 1이 단계 3 일 경우에만 성공적이라는 말로 고음을주고 싶습니다. 성공했습니다. 그리고 장시간 실행되는 트랜잭션이 그러한 시스템의 처리량을 손상 시킨다는 것을 알고 있어야합니다. 그래서 마지막 질문에 : YES, RMI 또는 WebServices와 같은 동기식 프로토콜이 단일 컨트롤러를 사용하여 작업을 쉽게하고 동기가 잘 맞으면 짧게 유지할 수 있습니다. –

+0

@Sir RotN, 답장과 아이디어에 감사드립니다. 이러한 엔드 포인트를 하나의 트랜잭션으로 그룹화하려고하지만 현재이 엔드 포인트는 다른 클라이언트에 대한 서비스로 존재합니다. UI에 사용할 수있는 REST 서비스 인터페이스가 있습니다. – kdye43

답변

2

:이 분산 트랜잭션이 트랜잭션 범위가 여러 네트워크 노드에 걸쳐 분산 시스템에서 트랜잭션을 의미

분산 트랜잭션. 분산 트랜잭션을 지원하기위한 기본적인 전제 조건은 표준 형식으로 트랜잭션 컨텍스트 전송을 지원하는 네트워크 프로토콜입니다 (분산 트랜잭션 관리자 참조). 분산 트랜잭션은 Apache Camel 트랜잭션의 범위 밖에 있습니다.

분산 트랜잭션 관리자 는 일반적으로 서버는 트랜잭션에 포함 된 리소스에 직접 연결합니다. 그러나 분산 시스템에서는 웹 서비스 나 CORBA IDL 인터페이스를 통해 간접적으로 만 노출되는 리소스에 연결해야하는 경우가 있습니다. 이 경우 분산 트랜잭션을 지원할 수있는 TP 모니터가 필요합니다. 다양한 분산 프로토콜 (예 : 웹 서비스 용 WS-AtomicTransactions 사양 및 CORBA 응용 프로그램 용 OTS (Object Transaction Service) 사양)과 같은 트랜잭션을 지원하는 방법을 설명하는 몇 가지 표준을 사용할 수 있습니다.

그래서 당신이 쾅쾅 거리고있는 것은 당연합니다. Apache Camel은 사용 사례를 다루지 않습니다.보상 행동 바람둥이에

JTA JTA 글로벌 트랜잭션 매니저와

  1. 큰 분산 트랜잭션
  2. 협정 작은 거래 :

    나는 두 가지 방법을 갈 수 있다고 생각합니다. 두 솔루션 모두에서이 기능이 필요할 수도 있습니다. Tomcat은 JTA 트랜잭션을 실행할 수 없지만 트랜잭션 관리자의 도움을 받아 수행 할 수 있습니다. Atomikos vs JOTM vs Bitronix vs?을 참조하십시오. JtaTransactionManager 봄을 추가하면 쉽게 구성 할 수 있습니다. 모든 JMS 구현이 JTA /를 지원하는 것은 아니며 XA 리소스입니다. 당신은 당신이하는지 확인해야 할 것입니다.

    분산 트랜잭션 거래의 기간은 매우 긴하지 않지만 그럼에도 불구하고 꽤 오랫동안 잠겨 자원을 유지됩니다, 당신은 많은 트랜잭션이있다. 성능이 손상 될 것입니다.

    JTA는 JTS 및 OTS를 기반으로합니다. JTA 서버는 OTS를 통해 다른 JTA 서버와 트랜잭션을 조정할 수 있어야합니다. 이 작업을 지원하는 구현을 찾아야 만 시작할 수 있습니다. 그런 다음 어떻게 작동시키는 지 알아 내야합니다.

    상위 레벨에서는 WS-Transactions 및 WS-Coordination이 있습니다. the metro guide을 참조하십시오.

    보정 작업을 Transaction in SOA은 롤백되지 않지만, 어떤 보상 조치 단계가 실패 할 때 발생하는 혼란을 정리하기 위해 취할 수 조정 작은 거래의 세트를 사용하는 것이 더있을 수 있음을 시사한다.

    시간 초과시 알림을 보내는 것은 그러한 동작 중 하나입니다. 주문 요청을 이행 할 수 없다는 것을 알게되면 엔드 포인트 1에서 작성한 주문 요청을 취소하면 다른 보상 조치가 될 수 있습니다.

    이 방법으로 완전히 이동할 수 있다면 받아 들일 수 있습니다.

+0

나는 감히이 대답을 부르지 않을지 확신하지 못하지만, 적어도 여기에서는 의견보다 큽니다. 귀하의 진정한 질문은 분산 트랜잭션 관리자를 설정하는 방법입니다. 질문을 수정하고 다른 대안을 제시하기를 바랍니다. – flup

+0

매우 상세한 답변을 보내 주셔서 감사합니다. 저는 Atomikos를 Camel의 JTA Transaction Manager로 활용하려고 시도했다고 언급하지 않았습니다. 제 사과를 제외하고 제발. 이를 반영하기 위해 질문을 업데이트했습니다. 보상 거래 측면에서 볼 때, 내가 가진 접근 방식의 문제는 데이터를 변경 한 직후와 롤백 한 직후에 누군가가 행동한다는 것입니다. 또는 jms 메시지를 보낸 후 프로세스의 다음 단계에서 오류가 발생하면 어떻게해야합니까? 어떻게 jms 메시지를 실행 취소 하시겠습니까? 그 말을 듣고, 아마도 WS 또는 CORBA를 사용해야 할 것입니다. – kdye43

+0

글쎄, 엔드 포인트 2 가져 가라. 데이터베이스에서 주문을 생성합니다. 계속 나아 간다. 나중에이 프로세스에서 고객은 충분한 신용이 없기 때문에 주문을 처리해서는 안된다는 것을 알게됩니다. 주문을 롤백 할 수 없으므로 거래가 열리지 않습니다. 하지만 대신 취소 할 수 있습니다. 다른 사람들이 이미 그것에 행동했다면, 그들은 또한 그들의 행동을 취소합니다. 이것이 좋지 않거나 너무 자주 발생하고 비용이 너무 많이 든다면 주문 예약으로 주문을 만드십시오. 커밋 할 준비가되면 끝점 2를 다시 호출하십시오. 이 시간에 예약을 확인하십시오. – flup