11.4. 경쟁 소비자
11.4.1. 개요
그림 11.3. “경쟁 소비자 패턴” 에 표시된 경쟁 소비자 패턴을 사용하면 여러 소비자가 동일한 대기열에서 메시지를 가져올 수 있으며 각 메시지가 한 번만 사용됩니다. 이 패턴은 직렬 메시지 처리를 동시 메시지 처리(응답 대기 시간 감소)로 교체하는 데 사용할 수 있습니다.
그림 11.3. 경쟁 소비자 패턴
다음 구성 요소는 경쟁하는 소비자 패턴을 보여줍니다.
11.4.2. JMS 기반 경쟁 소비자
일반 JMS 대기열은 암시적으로 각 메시지를 한 번에만 사용할 수 있도록 보장합니다. 따라서 JMS 대기열은 경쟁하는 소비자 패턴을 자동으로 지원합니다. 예를 들어 다음과 같이 JMS 대기열인 HighVolumeQ
에서 메시지를 가져오는 경쟁적인 세 소비자를 정의할 수 있습니다.
from("jms:HighVolumeQ").to("cxf:bean:replica01"); from("jms:HighVolumeQ").to("cxf:bean:replica02"); from("jms:HighVolumeQ").to("cxf:bean:replica03");
CXF(Web services) 끝점, replica01
,replica02
, replica03
인 경우 HighVolumeQ
큐의 메시지를 병렬로 처리합니다.
또는 경쟁하는 소비자의 스레드 풀을 생성하기 위해 JMS 쿼리 옵션인 concurrentConsumers
를 설정할 수 있습니다. 예를 들어 다음 경로는 지정된 대기열에서 메시지를 선택하는 세 가지 경쟁적인 스레드 풀을 생성합니다.
from("jms:HighVolumeQ?concurrentConsumers=3").to("cxf:bean:replica01");
그리고 concurrentConsumers
옵션은 다음과 같이 XML DSL에도 지정할 수 있습니다.
<route> <from uri="jms:HighVolumeQ?concurrentConsumers=3"/> <to uri="cxf:bean:replica01"/> </route>
JMS 주제는 경쟁하는 소비자 패턴을 지원할 수 없습니다. 정의에 따라 JMS 주제는 동일한 메시지의 여러 복사본을 다른 소비자에 전송하기 위한 것입니다. 따라서 경쟁하는 소비자 패턴과 호환되지 않습니다.
11.4.3. SEDA 기반 경쟁 소비자
SEDA 구성 요소의 목적은 계산을 단계로 분할하여 동시 처리를 단순화하는 것입니다. SEDA 엔드포인트는 기본적으로 메모리 내 차단 대기열을 캡슐화합니다( java.util.concurrent.BlockingQueue
). 따라서 SEDA 엔드포인트를 사용하여 각 스테이지에서 여러 스레드를 사용할 수 있는 단계로 경로를 분할할 수 있습니다. 예를 들어 다음과 같이 두 단계로 구성된 SEDA 경로를 정의할 수 있습니다.
// Stage 1: Read messages from file system. from("file://var/messages").to("seda:fanout"); // Stage 2: Perform concurrent processing (3 threads). from("seda:fanout").to("cxf:bean:replica01"); from("seda:fanout").to("cxf:bean:replica02"); from("seda:fanout").to("cxf:bean:replica03");
첫 번째 단계에는 파일 끝점, file://var/messages
의 메시지를 사용하고 SEDA 끝점인 seda:fanout
로 라우팅하는 단일 스레드가 포함되어 있습니다. 두 번째 단계에는 cxf:bean:replica01
로 교환을 라우팅하는 스레드, cxf:bean:replica02
.로 교환되는 스레드 및 cxf:bean:replica03
으로의 교환을 라우팅하는 스레드의 세 가지 스레드가 포함되어 있습니다. 이 세 개의 스레드는 차단 큐를 사용하여 구현되는 SEDA 엔드포인트에서 교환 인스턴스를 가져오기 위해 경쟁합니다. 차단 대기열은 잠금을 사용하여 두 개 이상의 스레드가 한 번에 큐에 액세스하지 못하도록 하기 때문에 각 교환 인스턴스마다 한 번만 사용할 수 있습니다.
SEDA 엔드포인트와 thread()
에서 생성한 스레드 풀의 차이점에 대한 자세한 내용은 Apache Camel 구성 요소 참조 가이드의 SEDA 구성 요소를 참조하십시오.