응용 프로그램 설계 결정은 전체 메시징 성능에 상당한 영향을 미칠 수 있습니다.
성능에 영향을 미치는 가장 중요한 요소는 메시지 전달의 안전성에 영향을 미치는 요소입니다. 이러한 요소는 다음과 같습니다.
성능에 영향을 미치는 다른 응용 프로그램 설계 요소는 다음과 같습니다.
다음 절에서는 이러한 요소 각각이 메시징 성능에 미치는 영향을 설명합니다. 일반적으로 성능과 안정성은 동시에 얻을 수 없습니다. 즉, 안정성을 높이는 요소가 성능을 저하시키는 경향이 있습니다.
표 11–1은 여러 응용 프로그램 설계 요소가 일반적으로 메시징 성능에 어떤 영향을 미치는지 보여 줍니다. 이 표에서는 두 가지 시나리오(높은 안정성/낮은 성능 시나리오와 높은 성능/낮은 안정성 시나리오)와 각각을 특징 지우는 응용 프로그램 설계 요소의 선택을 보여 줍니다. 이러한 양극단 사이에는 안정성과 성능 모두에 영향을 미치는 여러 선택 사항과 상충이 있습니다.
표 11–1 높은 안정성 및 높은 성능 시나리오 비교
응용 프로그램 설계 요소 |
높은 안정성, 낮은 성능 시나리오 |
높은 성능, 낮은 안정성 시나리오 |
---|---|---|
전달 모드 |
지속성 메시지 |
비지속성 메시지 |
트랜잭션 사용 |
트랜잭션된 세션 |
트랜잭션 없음 |
확인 모드 |
AUTO_ACKNOWLEDGE or CLIENT_ACKNOWLEDGE |
DUPS_OK_ACKNOWLEDGE |
영구/비영구 가입 |
영구 가입 |
비영구 가입 |
선택기 사용 |
메시지 필터링 |
메시지 필터링 없음 |
메시지 크기 |
많은 수의 작은 메시지 |
적은 수의 큰 메시지 |
메시지 본문 유형 |
복합 본문 유형 |
단순 본문 유형 |
지속성 메시지는 브로커에 오류가 발생하는 경우 메시지 전달을 보장합니다. 브로커는 의도된 모든 사용자가 메시지 사용을 확인할 때까지 메시지를 영구 저장소에 저장합니다.
다음과 같은 이유로 브로커의 지속성 메시지 처리가 비지속성 메시지 처리보다 느립니다.
브로커는 브로커에 오류가 발생하더라도 지속성 메시지가 손실되지 않도록 안정적으로 메시지를 저장해야 합니다.
브로커는 수신되는 각 지속성 메시지의 수신을 확인해야 합니다. 메시지를 생성하는 메소드가 예외 없이 반환되면 브로커로의 전달이 보장됩니다.
클라이언트 확인 모드에 따라 브로커는 지속성 메시지를 사용자 클라이언트가 확인했는지 확인해야 할 수 있습니다.
영구 가입자가 있는 대기열과 주제는 비영구 메시지에 비해 속도가 약 40% 향상되었습니다. 이는 10k 크기 메시지와 AUTO_ACKNOWLEDGE 모드에서 생성된 결과입니다.
트랜잭션은 트랜잭션된 세션에서 생성된 모든 메시지와 트랜잭션된 세션에서 사용된 모든 메시지가 하나의 단위로 처리되거나 처리되지 않도록(롤백되도록) 보장합니다.
Message Queue는 로컬 트랜잭션과 분산 트랜잭션을 모두 지원합니다.
트랜잭션된 세션에서의 메시지 생성이나 확인은 다음과 같은 이유 때문에 트랜잭션되지 않은 세션보다 느립니다.
생성된 각 메시지와 함께 추가 정보를 저장해야 합니다.
가입이 없는 주제 대상에 전달되는 지속성 메시지는 일반적으로 삭제되지만 트랜잭션이 시작될 때 가입에 대한 정보를 사용할 수 없는 경우와 같이 일반적으론 그럴 수 없는데도 트랜잭션의 메시지가 저장되는 경우가 있습니다..
트랜잭션이 완료될 때 트랜잭션 내의 메시지 사용과 확인에 대한 정보를 저장하고 처리해야 합니다.
JMS 메시지 전달의 안정성을 보장하는 한 가지 방법은 Message Queue 브로커가 클라이언트에 전달한 메시지 사용에 대해 클라이언트가 확인 응답을 보내는 것입니다.
클라이언트의 메시지 확인 없이 세션이 닫히거나 확인이 처리되기 전에 브로커에 오류가 발생하는 경우 브로커는 해당 메시지를 재전송하여 JMSRedelivered 플래그를 설정합니다.
트랜잭션되지 않은 세션의 경우 클라이언트는 각각 고유한 성능 특성을 가지는 다음과 같은 세 가지 확인 모드 중 하나를 선택할 수 있습니다.
AUTO_ACKNOWLEDGE. 사용자가 메시지를 처리하면 시스템이 자동으로 메시지를 확인합니다. 이 모드는 공급자 오류 후 최대 한 개의 재전송 메시지를 보장합니다.
CLIENT_ACKNOWLEDGE. 응용 프로그램이 메시지가 확인되는 시점을 제어합니다. 이전 확인 이후 해당 세션에서 처리된 모든 메시지가 확인됩니다. 일련의 확인을 처리하는 동안 브로커가 실패하는 경우 해당 그룹에서 하나 이상의 메시지가 재전송될 수 있습니다.
DUPS_OK_ACKNOWLEDGE. 이 모드는 시스템에게 메시지를 느리게 확인하도록 명령합니다. 공급자 오류 후 여러 메시지가 재전송될 수 있습니다.
(CLIENT_ACKNOWLEDGE 모드를 사용하는 것은 처리 중에 공급자 오류가 발생하는 경우 모든 확인이 함께 처리되도록 보장하지 않는다는 점을 제외하고는 트랜잭션 사용과 유사합니다.)
확인 모드는 다음과 같은 이유로 성능에 영향을 미칩니다.
AUTO_ACKNOWLEDGE 및 CLIENT_ACKNOWLEDGE 모드에서는 브로커와 클라이언트 사이에 추가 제어 메시지가 필요합니다. 추가 제어 메시지는 처리 오버헤드를 추가하고 JMS 페이로드 메시지를 방해할 수 있으므로 처리가 지연됩니다.
AUTO_ACKNOWLEDGE 및 CLIENT_ACKNOWLEDGE 모드에서는 클라이언트가 추가 메시지를 사용할 수 있으려면 브로커가 클라이언트 확인을 처리했다고 확인할 때까지 대기해야 합니다. (이와 같은 브로커 확인은 브로커가 실수로 이 메시지를 재전송하지 않도록 보장합니다.)
사용자가 받은 모든 지속성 메시지에 대한 확인 정보로 Message Queue 영구 저장소를 업데이트해야 하므로 성능이 감소됩니다.
주제 대상의 가입자는 영구 가입자와 비영구 가입자의 두 가지 범주로 구분됩니다.
영구 가입은 다음과 같은 이유로 안정성이 향상되지만 처리량이 떨어집니다.
Message Queue 메시지 서비스는 브로커에 오류가 발생하더라도 복구 후 목록을 사용할 수 있도록 각 영구 가입에 할당된 메시지 목록을 영구 저장해야 합니다.
브로커에 오류가 발생하더라도 복구 후 해당 사용자가 활성화되면 메시지를 계속 전달할 수 있도록 영구 가입의 지속성 메시지가 영구적으로 저장됩니다. 반면 비영구 가입의 지속성 메시지는 영구 저장되지 않습니다. 브로커에 오류가 발생하는 경우 해당 사용자 연결이 끊기며 메시지가 전달되지 않습니다.
지속성 및 비지속성 10k 크기 메시지의 두 경우에 대한 영구 가입자와 비영구 가입자의 성능을 비교했습니다. 두 가지 경우 모두 AUTO_ACKNOWLEDGE 확인 모드를 사용합니다. 지속성 메시지의 경우에만 약 30%의 성능 감소 효과가 있음을 확인했습니다.
응용 프로그램 개발자가 특정 사용자들을 메시지 집합의 대상으로 지정할 수 있습니다. 이는 메시지 집합마다 고유 물리적 대상을 지정하거나 단일 물리적 대상을 사용하여 각 사용자에 대해 하나 이상의 선택기를 등록하여 수행할 수 있습니다.
선택기는 해당 문자열과 일치하는 등록 정보 값을 갖는 메시지만 특정 사용자에게 전달되도록 요청하는 문자열입니다. 예를 들어 선택기 NumberOfOrders >1은 NumberOfOrders 등록 정보 값이 2이상인 메시지만 전달합니다.
선택기를 사용하여 사용자를 생성하면 각 메시지를 처리하는 데 추가 처리가 필요하므로 여러 물리적 대상을 사용하는 것에 비해 성능이 떨어집니다. 선택기를 사용하는 경우 선택기가 이후의 메시지와 일치될 수 있도록 구문 분석되어야 합니다. 또한 각 메시지가 라우팅될 때 각 메시지의 메시지 등록 정보를 검색하고 선택기와 비교해야 합니다. 그러나 선택기를 사용하면 메시징 응용 프로그램의 융통성이 증가합니다.
생성자 클라이언트에서 브로커로 그리고 브로커에서 사용자 클라이언트로 더 많은 데이터가 전달되어야 하고 지속성 메시지의 경우 더 큰 메시지를 저장해야 하므로 메시지 크기는 성능에 영향을 미칩니다.
그러나 작은 메시지들을 단일 메시지로 일괄 처리하면 개별 메시지의 라우팅과 처리를 최소화하여 전체적 성능 향상을 제공할 수 있습니다. 이 경우 개별 메시지의 상태에 대한 정보는 손실됩니다.
AUTO_ACKNOWLEDGE 확인 모드에서 대기열 대상에 1k, 10k 및 100k 크기의 메시지를 전달할 때의 초당 처리량 비교 테스트에서, 비영구 메시지의 경우 1k 메시지는 약 50%, 10k 메시지는 약 20%, 100k 메시지는 약 5% 더 빨라졌습니다. 메시지 크기는 영구 메시지와 비영구 메시지 모두에서 성능에 큰 영향을 미쳤습니다. 100k 메시지는 10k 메시지보다 약 10배 더 빠르지만, 10k 메시지는 1k 메시지보다 약 5배 더 빠릅니다.
JMS는 복잡성 순서에 따라 아래에 대략적으로 표시된 다섯 개의 메시지 본문 유형을 지원합니다.
BytesMessage는 응용 프로그램에서 지정하는 형식의 바이트 집합을 포함합니다.
TextMessage는 간단한 Java 문자열입니다.
StreamMessage는 Java 프리미티브 값의 스트림을 포함합니다.
MapMessage는 일련의 이름-값 쌍을 포함합니다.
ObjectMessage는 Java 일련화 객체를 포함합니다.
일반적으로 메시지 유형은 응용 프로그램의 필요에 따라 제어되지만 좀 더 복잡한 유형(MapMessage 및 ObjectMessage)은 성능 저하(데이터 일련화 및 일련화 해제로 인한 저하)를 수반합니다. 성능 저하는 데이터의 단순성이나 복잡성에 따라 달라집니다.