복붙노트

[SPRING] 고성능 JMS 메시징

SPRING

고성능 JMS 메시징

올해 UberConf에서 슬라이드를 읽었고 스피커 중 하나가 Spring JMS가 메시지 대기열 시스템에 성능 오버 헤드를 추가한다고 주장하지만 슬라이드에서이를 지원할 증거는 없습니다. 스피커는 각 메시지가 모든 소비자에게 브로드 캐스트되는 대신 한 번만 전송되므로 기존의 "게시 - 구독"방법보다 지점 간 메시지가 빠르다고도합니다.

경험있는 Java 메시징 전문가가 여기에 무게를두고 몇 가지 전문 지식을 명확히 할 수 있는지 궁금합니다.

해결법

  1. ==============================

    1.1) Spring JMS의 오버 헤드는 JmsTemplate을 사용하여 아래의 캐싱 메커니즘을 사용하지 않고 메시지를 전송하는 것입니다. 본질적으로 JmsTemplate은 보내는 각 메시지에 대해 다음을 수행합니다.

    1) Spring JMS의 오버 헤드는 JmsTemplate을 사용하여 아래의 캐싱 메커니즘을 사용하지 않고 메시지를 전송하는 것입니다. 본질적으로 JmsTemplate은 보내는 각 메시지에 대해 다음을 수행합니다.

    이것은 재사용 할 수있는 수동 작성 코드와 비교할 수 있습니다.

    커넥션의 생성 이후, 세션과 프로듀서는 클라이언트와 JMS 프로 바이더 간의 통신과 물론 리소스 할당이 필요하기 때문에 많은 작은 메시지에 대해 꽤 큰 오버 헤드가 발생합니다.

    JMS 자원을 캐싱하여 쉽게이 문제를 해결할 수 있습니다. 예를 들어 Spring CachingConnectionFactory 또는 ActiveMQs PooledConnectionFactory를 사용합니다 (이 질문에 태그를 붙인 ActiveMQ를 사용하는 경우).

    전체 JavaEE 컨테이너에서 실행중인 경우에는 JNDI 연결 팩토리를 검색 할 때 풀링 / 캐싱이 내장되어 있고 암시 적입니다.

    스프링 기본 메시지 청취 컨테이너를 사용하여 수신하는 경우, 약간의 오버 헤드가 추가 될 수있는 얇은 레이어가 있지만, 주요 측면은 동시성 측면에서 성능을 조정할 수 있다는 것입니다.이 기사에서는이를 잘 설명합니다.

    2)

    PubSub은 게시자가 존재하는 구독자를 알 필요가없는 사용 패턴입니다. 단순히 p2p로 에뮬레이트 할 수 없습니다. 한편으로는 어떤 증거도없이 한 응용 프로그램에서 다른 응용 프로그램으로 동일한 메시지를 보내려면 pub-sub 설정이 메시지를 두 번 보내는 것보다 빠를 것이라고 주장합니다.

    반면에 한 명의 제작자와 한 명의 소비자 만있는 경우 일부 측면에서 관리하기가 쉽기 때문에 대기열이있는 P2P 패턴을 선택하십시오. P2P (대기열)는로드 균형을 조정할 수 있으며 pub / sub는로드 쉽지 않습니다 (쉽게).

    ActiveMQ에는 하이브리드 버전 인 Virtual Destinations가 있습니다. 기본적으로로드 균형 조정이 필요한 주제입니다.

    실제 구현은 업체마다 다르지만 주제와 대기열은 근본적으로 다르며 비슷한 성능으로 작동해야합니다. 대신 당신이 확인해야 할 것은 :

  2. ==============================

    2.마크 리차즈의 슬라이드에 대해 말하는거야? 그는 자신의 벤치 마크에 대한 소스 코드를 게시 했으므로 실제로 JmsTemplate 성능에 대한 자신의 주장을 테스트 할 수 있습니다. 그의 벤치 마크 코드는 Spring의 CachingConnectionFactory를 사용하지만 캐싱에도 불구하고 여전히 JmsTemplate에서 상당한 성능 저하를 보여줍니다. 나는 그의 코드를 실행, 프로파일 링 및 분석했다. 짧은 대답은 JmsTemplate의 오버 헤드가 무시할 만하 며 그의 코드에서 측정 가능한 성능 불균형은 ActiveMQ의 비동기 대 동기화 전송 모드와 관련이 있다는 것입니다. 나는 여기에 나의 분석을 올렸다.

    마크 리차즈의 슬라이드에 대해 말하는거야? 그는 자신의 벤치 마크에 대한 소스 코드를 게시 했으므로 실제로 JmsTemplate 성능에 대한 자신의 주장을 테스트 할 수 있습니다. 그의 벤치 마크 코드는 Spring의 CachingConnectionFactory를 사용하지만 캐싱에도 불구하고 여전히 JmsTemplate에서 상당한 성능 저하를 보여줍니다. 나는 그의 코드를 실행, 프로파일 링 및 분석했다. 짧은 대답은 JmsTemplate의 오버 헤드가 무시할 만하 며 그의 코드에서 측정 가능한 성능 불균형은 ActiveMQ의 비동기 대 동기화 전송 모드와 관련이 있다는 것입니다. 나는 여기에 나의 분석을 올렸다.

    JmsTemplate은 악마가 아닙니다.

  3. ==============================

    3.1) Spring 템플리트는 보내거나받은 각 메시지에 대한 연결 / 세션 열기 / 닫기입니다. 그것이 더 느린 이유입니다. 대부분의 JMS 구현은 연결 / 세션이 열려있을 때 성능이 향상되므로 모든 연결 설정 / 제거 비트를 수행하는 오버 헤드를 피하기 위해 메시지 미리 가져 오기와 같은 최적화를 사용할 수 있습니다.

    1) Spring 템플리트는 보내거나받은 각 메시지에 대한 연결 / 세션 열기 / 닫기입니다. 그것이 더 느린 이유입니다. 대부분의 JMS 구현은 연결 / 세션이 열려있을 때 성능이 향상되므로 모든 연결 설정 / 제거 비트를 수행하는 오버 헤드를 피하기 위해 메시지 미리 가져 오기와 같은 최적화를 사용할 수 있습니다.

    2) 주제가 둘 이상의 소비자에게 복사 / 복제하는 경우 일반적으로 주제가 더 느립니다. 이것은 물리학적인 문제 일뿐입니다. 10 메가의 메시지가 대기열로 보내지는 대기열이면 10 메가의 데이터 만 소비자에게 전송해야합니다. 주제에 대해 10 명의 소비자가 있고 10 메가의 데이터를 보내면 100 메가의 데이터를 소비자에게 전송해야합니다. 따라서 대부분의 JMS 구현에서 다음을 수행합니다.

  4. ==============================

    4.나는 메시지 전문가가 아니며, 여기에 내 생각을 공유하지 않길 바랍니다.)

    나는 메시지 전문가가 아니며, 여기에 내 생각을 공유하지 않길 바랍니다.)

  5. from https://stackoverflow.com/questions/11840630/high-performance-jms-messaging by cc-by-sa and MIT license