참조에 의해 메시지 페이로드 전달: 각 처리 단계에 대한 잠재적 이점
JMS 메시징 애플리케이션이 수행하는 각 처리 단계에서, 이 테이블을 확인하여 연관된 연결 팩토리 또는 활성 스펙에서 "참조에 의해 메시지 페이로드 전달" 특성을 사용하면 잠재적으로 성능면의 이점이 생기는 이유 및 시기를 알아볼 수 있습니다.
대용량 오브젝트 메시지 또는 바이트 메시지가 전송되면, 메시지 페이로드를 직렬화, 직렬화 해제 및 복사하는 데 사용하는 메모리 및 프로세서의 비용이 커질 수 있습니다. 연결 팩토리 또는 활성화 스펙에서 참조에 의한 메시지 페이로드 전달 특성을 사용하면, 기본 메시징 제공자가 JMS 1.1 스펙을 대체하고 이 데이터의 복사를 줄이거나 생략하도록 합니다.
경고:
이러한 특성에 의해 생략된 JMS 스펙의 파트는 메시징 데이터의 무결성을 보장하도록 정의됩니다. 이러한 특성을 사용하는 모든 JMS 애플리케이션은 참조에 의해 JMS 메시지 페이로드를 전달하는 이유 및 시기 주제에 설명된 규칙을 엄격히 따라야 합니다. 그렇지 않으면, 데이터 무결성을 잃게 됩니다.
참조에 의해 메시지 페이로드를 전달하려면
특성을
연결 팩토리 및 활성화 스펙을 설정하십시오.
- producerDoesNotModifyPayloadAfterSet(연결 팩토리의 경우) 또는 forwarderDoesNotModifyPayloadAfterSet(활성화 스펙의 경우)
- 이 특성이 사용 가능하면 연결 팩토리에 의해 생성되거나 활성화 스펙을 통해 전달된 오브젝트 또는 바이트 메시지는 메시지로 설정된 경우 복사되지 않으며 꼭 필요한 경우에만 직렬화됩니다. 이와 같은 메시지를 전송하는 애플리케이션에서는 데이터가 메시지로 설정된 후 이를 수정해서는 안 됩니다.
- consumerDoesNotModifyPayloadAfterGet
- 이 특성이 사용 가능하면 연결 팩토리 또는 활성화 스펙을 통해 수신된 오브젝트 메시지가 꼭 필요한 경우에만 직렬화됩니다. 해당 메시지에서 얻어진 데이터는 애플리케이션에서 수정하지 않아야 합니다.
처리 단계 | 성능 향상의 잠재성 여부 | 설명 |
---|---|---|
생성자 및 이용자 애플리케이션의 오브젝트 메시지 | ||
오브젝트 메시지는 동일한 JVM의 이용자 애플리케이션으로 전송됩니다. producerDoesNotModifyPayloadAfterSet 및 consumerDoesNotModifyPayloadAfterGet 특성 모두 사용 가능합니다. | 예 | 특정 조건에서 페이로드 오브젝트가 참조에 의해 이용자
애플리케이션으로 전달됩니다. 메시지가 지속적이 아니거나 처리되지 않고 이용자 애플리케이션을 즉시 사용할 수 있는 경우, 페이로드 오브젝트가 직렬화되지 않을 수 있습니다. |
오브젝트 메시지는 사용 가능한 producerDoesNotModifyPayloadAfterSet 특성으로 생성된 후 사용 불가능한 consumerDoesNotModifyPayloadAfterGet 특성의 이용자 애플리케이션에 의해 수신됩니다. | 아니오 | 이용자 애플리케이션에는 사용 가능한 consumerDoesNotModifyPayloadAfterGet 특성이 없기 때문에 얻을 수 있는 이점이 없습니다. |
오브젝트 메시지는 다른 JVM의 단일 이용자 애플리케이션으로 전송됩니다. producerDoesNotModifyPayloadAfterSet 및 consumerDoesNotModifyPayloadAfterGet 특성 모두 사용 가능합니다. | 아니오 | 단일 이용자 애플리케이션이 또 다른 JVM에 있기 때문에 얻을 수 있는 이점이 없습니다. |
오브젝트 메시지는 사용 가능한 consumerDoesNotModifyPayloadAfterGet 특성을 가지고 있으며 동일한 JVM에서 실행 중인 다중 이용자 애플리케이션(토픽)에 의해 수신됩니다. | 예 | 사용 가능한 consumerDoesNotModifyPayloadAfterGet 특성이 있는 모든 이용자 애플리케이션은 동일한 오브젝트에 대한 참조를 수신하지만 반드시 그렇지는 않습니다. |
전달자 애플리케이션의 오브젝트 메시지 | ||
오브젝트 메시지가 전달되고 전달자 애플리케이션은 메시지의 페이로드에 액세스합니다. consumerDoesNotModifyPayloadAfterGet 및 producer/forwarderDoesNotModifyPayloadAfterSet 특성이 사용 가능합니다. | 예 | 다음과 같은 경우 잠재적으로 성능에 대한 이점이
있습니다.
|
오브젝트 메시지가 전달되고 전달자 애플리케이션은 메시지의 페이로드에 액세스합니다. producer/forwarderDoesNotModifyPayloadAfterSet 특성만 사용 가능합니다. | 예 | 전달된 메시지의 이용자가 사용 가능한 consumerDoesNotModifyPayloadAfterGet 특성을 갖고 있으며 전달자 애플리케이션과 동일한 JVM에 있는 경우, 잠재적으로 성능에 대한 이점이 있습니다. |
오브젝트 메시지가 전달되고 전달자 애플리케이션은 메시지의 페이로드에 액세스하지 않습니다. | 아니오 | 전달자 애플리케이션이 오브젝트 메시지의 페이로드에 액세스하지 않는 경우, producer/forwarderDoesNotModifyPayloadAfterSet 및 consumerDoesNotModifyPayloadAfterGet 특성이 전달자 애플리케이션에 영향을 미치지 않습니다. 원래 생성자 애플리케이션 및 최종 이용자 애플리케이션에서 얻어진 이점은 유지됩니다. |
중개에 대한 오브젝트 메시지 | ||
오브젝트 메시지는 중개된 서비스 통합 버스 대상으로 전송됩니다. | 아니오 | 오브젝트 메시지가 중개된 대상으로 전송되는 경우 producerDoesNotModifyPayloadAfterSet 특성을 사용하여 얻어지는 성능의 이점은 없습니다. |
이용자 애플리케이션의 바이트 메시지 | ||
바이트 메시지는 임의의 이용자 애플리케이션으로 전송됩니다. producerDoesNotModifyPayloadAfterSet 특성이 사용 가능합니다. | 예 | 바이트 데이터의 사본이 저장되어, 메시지로 설정되는 데이터를 복사하도록 지정하는 JMS 스펙의 파트가 생략됩니다. |
바이트 메시지는 사용 가능한 consumerDoesNotModifyPayloadAfterGet 특성으로 수신됩니다. | 아니오 | JMS API를 사용하면 바이트 데이터가 이용자 코드(BytesMessage.readBytes methods)로 돌아가는 참조에 의해 전달될 수 없습니다. |
바이트 메시지는 사용 가능한 consumerDoesNotModifyPayloadAfterGet 특성을 가지고 있는 다중 이용자(토픽)에 의해 수신됩니다. | 아니오 | JMS API를 사용하면 바이트 데이터가 이용자 코드(BytesMessage.readBytes methods)로 돌아가는 참조에 의해 전달될 수 없습니다. |
전달자 애플리케이션의 바이트 메시지 | ||
바이트 메시지가 전달됩니다. | 아니오 | "참조에 의한 메시지 페이로드 전달" 특성을 사용하여 얻어지는 이점이 없습니다. |