10장. 흐름 제어
흐름 제어는 생산자와 소비자가 이들 간의 데이터 흐름을 제한하여 과잉되는 것을 방지합니다. AMQ Broker를 사용하면 소비자와 생산자 모두에 대한 흐름 제어를 구성할 수 있습니다.
10.1. 소비자 흐름 제어
소비자 흐름 제어는 클라이언트가 브로커의 메시지를 사용할 때 브로커와 클라이언트 간의 데이터 흐름을 규제합니다. AMQ Broker Client는 기본적으로 사용자에게 메시지를 전달하기 전에 메시지를 버퍼링합니다. 버퍼가 없으면 클라이언트는 먼저 브로커의 각 메시지를 사용하기 전에 요청해야 합니다. 이러한 유형의 "round-trip" 통신은 비용이 많이 듭니다. 클라이언트 측의 데이터 흐름을 집계하는 것은 소비자가 메시지를 빠르게 처리할 수 없을 때 메모리 문제가 발생하여 들어오는 메시지로 오버플로하기 시작할 때 메모리 문제가 발생할 수 있기 때문에 중요합니다.
10.1.1. 소비자 창 크기 설정
클라이언트 쪽 버퍼에 보관된 메시지의 최대 크기는 창 크기에 따라 결정됩니다. AMQ Broker 클라이언트의 기본 창 크기는 1MiB 또는 1024바이트입니다. 대부분의 사용 사례에는 기본값이 적합합니다. 다른 경우에는 창 크기에 가장 적합한 값을 검색하려면 시스템 벤치마킹이 필요할 수 있습니다. AMQ Broker를 사용하면 기본값을 변경해야 하는 경우 버퍼 창 크기를 설정할 수 있습니다.
창 크기 설정
다음 예제에서는 코어 JMS 클라이언트를 사용할 때 소비자 창 크기 매개 변수를 설정하는 방법을 보여줍니다. 각 예제에서는 소비자 창 크기를 300000
바이트로 설정합니다.
절차
소비자 창 크기를 설정합니다.
코어 JMS 클라이언트가 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로
consumerWindowSize
매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는jndi.properties
파일을 사용하여 URL을 저장합니다.java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=300000
코어 JMS 클라이언트가 JNDI를 사용하여 연결 팩토리를 인스턴스화하지 않으면
ActiveMQConnectionFactory.setConsumerWindowSize()
로 값을 전달합니다.ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConsumerWindowSize(300000);
10.1.2. 빠른 소비자 처리
빠른 소비자는 메시지를 사용하는 만큼 빠르게 처리할 수 있습니다. 메시징 시스템의 소비자가 빠른 것으로 확신하는 경우 창 크기를 -1
로 설정합니다. 이 설정을 사용하면 클라이언트 측에서 바인딩되지 않은 메시지 버퍼링이 가능합니다. 그러나 이 설정을 주의해서 사용하십시오. 소비자가 메시지를 수신하는 속도만큼 빠르게 처리할 수 없는 경우 클라이언트 측 메모리를 오버플로울 수 있습니다.
빠른 소비자를 위한 창 크기 설정
절차
아래 예제에서는 빠른 메시지 소비자인 코어 JMS 클라이언트를 사용할 때 창 크기를 -1
로 설정하는 방법을 보여줍니다.
소비자 창 크기를
-1
로 설정합니다.코어 JMS 클라이언트가 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로
consumerWindowSize
매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는jndi.properties
파일을 사용하여 URL을 저장합니다.java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=-1
코어 JMS 클라이언트가 JNDI를 사용하여 연결 팩토리를 인스턴스화하지 않으면
ActiveMQConnectionFactory.setConsumerWindowSize()
로 값을 전달합니다.ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConsumerWindowSize(-1);
10.1.3. 하위 소비자 처리
느린 사용자는 각 메시지를 처리하는 데 상당한 시간이 걸립니다. 이 경우 클라이언트 측에서 메시지를 버퍼링하지 않는 것이 좋습니다. 메시지는 다른 소비자가 사용할 준비가 된 브로커 측에서 남아 있습니다. 버퍼를 끄는 한 가지 이점은 큐에서 여러 소비자 간에 결정적 배포를 제공 한다는 것입니다.One benefit of turning off the buffer is that it provides deterministic distribution between multiple consumers on a queue. 클라이언트 측 버퍼를 비활성화하여 느린 소비자를 처리하려면 창 크기를 0
으로 설정합니다.
Slow Consumers의 창 크기 설정
절차
아래 예제에서는 느린 메시지 소비자인 코어 JMS 클라이언트를 사용할 때 창 크기를 0
으로 설정하는 방법을 보여줍니다.
소비자 창 크기를
0
으로 설정합니다.코어 JMS 클라이언트가 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로
consumerWindowSize
매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는jndi.properties
파일을 사용하여 URL을 저장합니다.java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=0
코어 JMS 클라이언트가 JNDI를 사용하여 연결 팩토리를 인스턴스화하지 않으면
ActiveMQConnectionFactory.setConsumerWindowSize()
로 값을 전달합니다.ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConsumerWindowSize(0);
관련 정보
느린 소비자를 처리할 때 소비자 버퍼링을 방지하기 위해 브로커를 구성하는 방법을 보여주는 예는INSTA LL_DIR
/examples/standard의 no-consumer-buffering
예제를 참조하십시오.
10.1.4. 메시지 사용 비율 설정
사용자가 메시지를 사용할 수 있는 속도를 조정할 수 있습니다. "기호"라고도 하며 소비률을 조정하여 소비자가 구성 허용보다 빠른 속도로 메시지를 사용하지 않도록 합니다.
속도 제한 흐름 제어는 창 기반 흐름 제어와 함께 사용할 수 있습니다. 속도 제한 흐름 제어는 클라이언트가 버퍼에 있는 메시지의 수가 아니라 초당 사용할 수 있는 메시지 수에만 영향을 미칩니다. 느린 속도 제한 및 높은 창 기반 제한으로 클라이언트의 내부 버퍼는 메시지로 빠르게 채워집니다.
이 기능을 사용하려면 속도가 양의 정수여야 하며 초당 메시지 단위로 지정된 최대 메시지 사용률입니다. 이 속도를 -1
로 설정하면 속도 제한 흐름 제어가 비활성화됩니다. 기본값은 -1
입니다.
메시지 사용 비율 설정
절차
아래 예제에서는 메시지를 초당 10
개 메시지로 제한하는 코어 JMS 클라이언트를 사용합니다.
소비자 비율을 설정합니다.
코어 JMS 클라이언트가 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로
consumerMaxRate
매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는jndi.properties
파일을 사용하여 URL을 저장합니다.java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory java.naming.provider.url=tcp://localhost:61616?consumerMaxRate=10
코어 JMS 클라이언트가 JNDI를 사용하여 연결 팩토리를 인스턴스화하지 않는 경우 해당 값을
ActiveMQConnectionFactory.setConsumerMaxRate()
로 전달합니다.ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConsumerMaxRate(10);
관련 정보
소비자 속도를 제한하는 방법에 대한 작업 예제는INSTA LL_DIR
/examples/standard의 consumer-rate-limit
예제를 참조하십시오.