미들웨어를 통한 HTTP/JMS를 통한 하이브리드 비누에 대한 요청 상관 모델

StackOverflow https://stackoverflow.com/questions/1621532

문제

당사 제품 중 하나는 다음과 같은 편도 웹 서비스 구조를 구현합니다.

Server <--------------------- Middleware <---------------- Client
        SOAP over JMS (queue)              SOAP over HTTP

이 모델에서 클라이언트는 HTTP를 통해 비누 메시지를 미들웨어 (Progress SonicMQ)로 보냅니다. SonicMQ에 의해 메시지가 JMS 대기열로 푸시되고 서버는 여기에서 가져옵니다. 그러나 보시다시피 서버는 클라이언트 (비동기 JMS)에 응답을 보내지 않습니다.

이 모델에 대한 응답 채널을 구현하고 싶습니다. 종종 제안되는 솔루션은 미들웨어에 임시 답변 대기 시간 (즉석)을 만들어 서버가 해당 대기열에 대한 응답을 보낼 수 있도록하는 것입니다. 그런 다음 클라이언트가 응답을 가져올 수 있고 답장-큐가 닫힙니다. 이것은 충분히 편리하게 들리지만 불행히도 우리 고객은 JMS가 아닌 일반 HTTP를 통해 운영되므로 고객은 REPLY를 쉽게 설정할 수 없습니다.

이러한 하이브리드 HTTP/JMS SOAP 모델에서 응답 채널을 달성하기위한 한 가지 방법은 중간ware를 구성하여 각 성공적인 비누 수신에 대한 REPLY 대기열을 열어주는 것입니다. 서버가 가져 오는 대기열. 메시지를 수신하고 처리 한 후 서버는 미들웨어에서 표시된 REPLY-QUEUE에 대한 응답을 보낼 수 있습니다. 마지막으로, 미들웨어는 SOAP 메시지의 데이터 (요청이 처음 수신되었을 때 미들웨어 절차에 삽입 된 데이터)를 사용하여 HTTP를 통해 원래 클라이언트에게 HTTP를 통해 응답 (SOAP)을 보냅니다.

가능할 가능성이 있지만, 이것은 일종의 해킹처럼 들립니다. 따라서 질문은 다음과 같습니다. 우리의 경우 그러한 요청/응답 모델을 달성하는 더 깨끗한 방법은 무엇입니까? 서버 종료는 Java에서 구현되었습니다.

해결책:

Progress SonicMQ는 "Content Reply Send"HTTP 수락기를 지원하여 JMS 답장을 쉽게 보낼 수 있습니다. 컨텐츠 답글 보내기 수용자는 다음과 같은 방식으로 작동합니다.

  • 수락자는 클라이언트가 보낸 HTTP 메시지를받습니다
  • 수용자는 임시 JMS 대기열을 만듭니다
  • acceptor는 HTTP 본문을 포함하는 JMS 메시지를 작성하고 새로 생성 된 JMS 메시지에 임시 큐의 식별을 추가합니다.
  • 수용자는 JMS 메시지를 대상 대기열로 푸시합니다 (임시 대기열이 아님)
  • 수용자는 임시 답변 대기열을 소비하기 시작합니다
  • 클라이언트가 원래 대상 대기열에서 메시지를 가져 오면 설정 정답 큐 식별 설정이 포함됩니다.
  • 클라이언트는 메시지를 소비합니다
  • 클라이언트는 회신 대기열에 답장을 보냅니다
  • 수용자는 대기열에서 메시지를받습니다
  • 수락자는 원래 HTTP 메시지를 보낸 클라이언트에게 HTTP로 메시지를 보냅니다.

소비자 (우리의 경우 "서버")가 실패하고 시간 초과를 일으키는 회신을 보내지 않으면 Sonic의 HTTP 수락자는 시간 초과를 나타내는 클라이언트에게 HTTP 메시지를 보냅니다. 이것은 SonicMQ에서 매우 표준적인 기능입니다. 다른 제품에도 존재한다고 생각합니다.

이를 통해 "서버"끝에서 JMS (Skaffman의 답변 참조)를 통해 표준 비누를 사용할 수 있습니다.

그래도 JMS 모델에서 여전히 몇 가지 문제가 있지만 이것은 분명히 개선입니다.

2009-11-05 업데이트 :

이 문제를 더 많이 연구 한 후에는 http <-> 미들웨어 <--> JMS에 대한 나의 의심이 관련이 있습니다.

이 모델에는 몇 가지 중요한 문제가 있습니다. 미들웨어와 동기식 모델이 편리하지 않습니다. 양쪽 끝이 JMS 연결 (흔들려 야 함)을 구현하거나 양쪽 끝에서 HTTP와 함께 이동합니다. 그것들을 혼합하면 두통만으로 결과가 나옵니다. 이 두 가지 중 Soap-Over-HTTP는 SOAP-Over-JMS보다 간단하고 더 잘 지원됩니다.

다시 한 번 : 이런 종류의 시스템을 설계하고 있다면 ...하지 마십시오.

도움이 되었습니까?

해결책

귀하의 제안 된 솔루션이 전혀 해킹이라고 생각하지 않습니다. 이것이 올바른 솔루션이라고 생각합니다. 동기식 프로토콜을 갖춘 클라이언트-중간 계층과 비동기 레이어를 사용하여 중간 서버 레이어를 사용하여 동기 시맨틱을 만족시키기 위해 응답 경로를 추가해야합니다. 그것이 미들웨어의 목적입니다. JMS는 임시 답변 대기열에 대한 명시 적 지원을 제공하며, 페이로드를 전혀 엉망으로 만들 필요가 없습니다.

더 왼쪽 필드 가능성은 SOAP 1.2가 JMS를 염두에두고 설계되었다는 사실을 활용하므로 Soap-Over-JMS를 수행하는 미들웨어와 서버 계층 사이에 웹 서비스 계층을 사용할 수 있습니다. 즉, 미들웨어는 운송 만 변경하면서 비누를 엔드 투 엔드에서 유지할 수 있습니다.

JMS 전송을 지원하는 유일한 웹 서비스 스택은 다음과 같습니다. 봄 웹 서비스, 프로세스와 개발이있는 곳 여기에 문서화되었습니다. 이것은 또한 비누 층을 스프링 -WS로 포트 할 수있는 기회를 제공합니다.

다른 팁

사용자가 응답이 준비된시기를 확인할 수 있도록 페이지에 링크를 추가하지 않겠습니까? 요청을 보낼 때 사용자에게 트래커 ID를 제공하십시오.

이것은 HTTP 요청/응답 관용구에 적합하며 사용자는 여전히 요청이 "화재와 잊어 버린다"는 것을 알고 있습니다.

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