Message Queue와 웹 서비스? [닫은]


258

어떤 조건에서 웹 서비스 대신 메시지 큐를 통해 말하는 앱을 선호 하는가?

로컬 네트워크에서 두 앱간에 대화해야합니다. 하나는 웹 앱이며 다른 하드웨어에서 실행되는 다른 앱에서 명령을 요청해야합니다. 요청은 사용자 작성, 파일 이동 및 디렉토리 작성과 같은 것입니다. 메시지 대기열을 사용하는 것보다 XML 웹 서비스 (또는 직접 TCP 등)를 선호하는 조건은 무엇입니까?

웹 응용 프로그램은 Ruby on Rails이지만 질문이 그보다 광범위하다고 생각합니다.

답변:


315

웹 서비스를 사용하면 클라이언트와 서버가 있습니다.

  1. 서버가 실패하면 클라이언트는 오류를 처리해야합니다.
  2. 서버가 다시 작동하면 클라이언트는 서버를 다시 보내야합니다.
  3. 서버가 호출에 응답하고 클라이언트가 실패하면 작업이 손실됩니다.
  4. 경합이 없습니다. 즉, 수백만 명의 클라이언트가 한 서버에서 한 번에 웹 서비스를 호출하면 서버가 다운 될 수 있습니다.
  5. 서버에서 즉각적인 응답을 기대할 수 있지만 비동기 호출도 처리 할 수 ​​있습니다.

RabbitMQ, Beanstalkd, ActiveMQ, IBM MQ Series, Tuxedo와 같은 메시지 큐를 사용하면 다른 내결함성 결과를 기대할 수 있습니다.

  1. 서버가 실패하면 큐는 메시지를 유지합니다 (선택적으로 시스템이 종료 된 경우에도).
  2. 서버가 다시 작동하면 보류중인 메시지를받습니다.
  3. 서버가 호출에 응답하고 클라이언트가 실패하면 클라이언트가 응답을 인식하지 못하면 메시지가 지속됩니다.
  4. 경합이 있으며 서버가 처리하는 요청 수를 결정할 수 있습니다 (대신 작업 자라고 함).
  5. 즉각적인 동기 응답을 기대하지는 않지만 동기 호출을 구현 / 시뮬레이트 할 수 있습니다.

Message Queues에는 훨씬 더 많은 기능이 있지만 이는 오류 조건을 직접 처리 할 것인지 아니면 Message Queue에 남겨 둘 것인지 결정하는 몇 가지 규칙입니다.


1
경우 SOAP / JMS가 사용되는 바인딩, 하나는 웹 서비스의 느슨한 결합을 얻는다.
koppor

웹 서비스 또는 큐 중 선호해야하는 서버 측의 여러 마이크로 서비스의 경우?
shivendra pratap singh

친애하는 @sw. , 이것이 일반적인 웹 사이트 앞에 MQ를 배치 할 수 있는지 여부를 알 수 있습니까? Wordpress Website (LAMP 스택)가 있다고 가정 해 봅시다. 요청이 모두 동시에 발생하는 대신 1 이후에 발생하도록 Apache infront MQ를 사용할 수 있습니까? 이 경우 클라이언트 (브라우저)가 Apache 대신 MQ에 연결됩니다. 맞습니까? 그렇다면 브라우저는 HTTP 연결을 열어두고 Apache가 응답하기를 계속 기다리나요? 이것에 대해 조금 이해하도록 도와주세요. 당신의 친절을 감사하십시오.
夏 期 劇場

@ 夏 期 劇場 사용 사례는 무엇입니까? 최종 사용자가 브라우저를 사용하여 얻는 이점을 얻으려고 무엇입니까?
sw.

클라이언트 / 서버 설정에 대한 이러한 우려가 여전히 큐와 서버 사이 및 클라이언트와 큐 사이의 우려가 아닙니까? 클라이언트 / 서버 패러다임이 여전히 존재하며 현재 두 곳에있는 것 같습니다.
imagineerThat

75

REST HTTP 호출이 메시지 큐 개념을 대체 할 수있는 방법을 고려한 최근의 많은 연구가있었습니다.

프로세스 및 작업 개념을 리소스로 도입하면 중간 메시징 계층에 대한 필요성이 사라지기 시작합니다.

전의:

POST /task/name
    - Returns a 202 accepted status immediately
    - Returns a resource url for the created task: /task/name/X
    - Returns a resource url for the started process: /process/Y

GET /process/Y
    - Returns status of ongoing process

작업에는 여러 단계의 초기화가있을 수 있으며 프로세스는 폴링시 상태를 반환하거나 완료되면 콜백 URL로 POST 할 수 있습니다.

이것은 매우 간단하며, 중간 계층없이 실행중인 모든 프로세스 및 작업의 rss / atom 피드에 가입 할 수 있다는 것을 알게되면 매우 강력 해집니다. 모든 큐잉 시스템에는 어쨌든 일종의 웹 프론트 엔드가 필요하며이 개념은 다른 사용자 정의 코드 계층없이 내장되어 있습니다.

리소스는 삭제할 때까지 존재하므로 프로세스 및 작업이 완료된 후 오랫동안 기록 정보를 볼 수 있습니다.

복잡한 프로토콜없이 여러 단계를 수행하는 작업에 대해서도 서비스 검색 기능이 내장되어 있습니다.

GET /task/name
    - returns form with required fields

POST (URL provided form's "action" attribute)

서비스 검색은 HTML 형식으로, 사람이 읽을 수있는 범용 형식입니다.

전체적으로 사용되는 도구를 사용하여 프로그래밍 방식으로 또는 사람이 전체 흐름을 사용할 수 있습니다. 클라이언트 중심이므로 RESTful입니다. 웹용으로 작성된 모든 도구는 비즈니스 프로세스를 이끌 수 있습니다. 별도의 로그 서버 배열에 비동기식으로 POST하여 대체 메시지 채널이 계속 있습니다.

잠시 동안 생각해 본 후, 휴식을 취하고 REST가 메시징 큐와 ESB의 필요성을 완전히 제거 할 수 있음을 깨닫기 시작합니다.

http://www.infoq.com/presentations/BPM-with-REST


11
@tempire 내결함성 등은 어떻습니까? REST는 훌륭하지만 개발자는 스스로 미들웨어를 구축하게됩니다
Dan Rosenstark 1

10
@Yar '이것은 어떻습니까'에 대한 대부분의 질문은 '웹에서 어떻게 처리됩니까?' 내결함성은로드 밸런서 또는 dns 레코드 조작을 통해 처리 할 수 ​​있습니다. 수평 확장 성과 같이 해결해야 할 몇 가지 문제가 더 있습니다. 웹은 본질적으로 잘 처리하지 못합니다 (예 : ddos ​​공격).
tempire

8
@tempire, 웹에서 보장 된 배달이 없습니다. 제출을 누르고 메시지가 목적지에 도착하도록기도하십시오. MQ를 사용하면 MQ에 도달하면 완료된 것입니다. 메시지를 목적지로 가져 오는 것을 처리합니다.
Dan Rosenstark

10
@Yar는 '보증 된 배달'의 의미를 고려합니다. 메시지 대기열의 가동 시간만큼 '보증'됩니다. 메시지 대기열을 작업 및 프로세스를 리소스로 취급하는 REST 서버로 바꾸십시오. 다른 것과 동일한 '보증인'이 있습니다. 기본적으로 여전히 메시지 대기열이 있지만 웹 도구를 사용하여 모니터링 할 수있는 웹 표준 액세스 형식이 있습니다.
tempire

16
@Yar-많은 사람들이 MQ가 그러한 것들을 고려하기에 충분히 해결하려고하는 문제 정의를 이해한다고 생각하지 않습니다. MQ를 이해하지만 문제 공간을 이해하는 것과 다릅니다. 그러나 전 세계의 대부분의 프로그래머와 관리자가 엔지니어 솔루션 대신 조각을 연결하도록 훈련 받았다고 생각하기 때문에 광범위한 문제가 있습니다.
tempire

32

메시지 대기열은 처리하는 데 시간이 오래 걸릴 수있는 요청에 이상적입니다. 요청은 대기열에 있으며 클라이언트를 차단하지 않고 오프라인으로 처리 할 수 ​​있습니다. 클라이언트에게 완료 알림을 받아야하는 경우 클라이언트가 요청 상태를 주기적으로 확인하는 방법을 제공 할 수 있습니다.

메시지 대기열을 사용하면 시간이 지남에 따라 더 잘 확장 할 수 있습니다. 실제 처리가 시간에 따라 분산 될 수 있기 때문에 많은 활동의 버스트를 처리하는 능력이 향상됩니다.

메시지 대기열과 웹 서비스는 직교 개념입니다. 즉 상호 배타적이지 않습니다. 예를 들어, 메시지 큐에 대한 인터페이스 역할을하는 XML 기반 웹 서비스를 가질 수 있습니다. 나는 당신이 찾고있는 차이점은 Message Queues 대 Request / Response라고 생각합니다. 후자는 요청이 동 기적으로 처리 될 때입니다.


3
예, 나는 단지 이것을 생각하고있었습니다 : 그들이 막고 있는지 아닌지가 아닙니다. 처리하는 데 더 길거나 예측할 수없는 시간이 필요한지 여부입니다 ... 직교하는 것에 관해서는 웹 서비스를 긴 요청에 사용할 수 있다는 것도 사실입니다 (물론 별도의 하차 및 픽업). 그러나 메시지 대기열의 고급 스러움이 있다면 좋은 생각 일 수 있습니다.
Dan Rosenstark

내 새로운 질문은 프로세스가 동기식이지만 시간 초과시 비동기식이 되려면 어떻게해야합니까? 그렇다면 아마도 웹 서비스가 더 적합 할 것입니다.
Dan Rosenstark 1

27

메시지 대기열은 비동기식이며 배달이 실패하면 여러 번 재 시도 할 수 있습니다. 요청자가 응답을 기다릴 필요가없는 경우 메시지 큐를 사용하십시오.

"웹 서비스"라는 문구는 HTTP를 통한 분산 구성 요소에 대한 동기 호출을 생각합니다. 요청자에게 응답이 필요한 경우 웹 서비스를 사용하십시오.


1
고마워요, "보증 된 배달"그게 중요한지 생각해야합니다. 내 말은, 동기화 대 비동기는 어떤 의미에서 일종의 맛입니다. 명백한 흑백 사례가 있지만 거대한 회색 중간도 있습니다.
Dan Rosenstark 1

22

일반적으로 차단 작업에 대한 웹 서비스 (더 많은 코드를 실행하기 전에이 작업을 완료해야 함)와 비 차단 작업에 대한 메시지 대기열 (시간이 오래 걸릴 수 있음)을 원한다고 생각합니다. 기다릴 필요가 없습니다).


웹 서비스는 또한 단방향 방법 ( @Oneway )을 제공합니다. 답변을 받으려면 클라이언트가 웹 서비스를 제공해야합니다.
koppor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.