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/standardno-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/standardconsumer-rate-limit 예제를 참조하십시오.