9장. Dead Connections 탐지

경우에 따라 클라이언트는 예기치 않게 중지되고 리소스를 정리할 수 없습니다. 이 경우 리소스를 결함이 있는 상태로 유지하면 브로커가 메모리 또는 기타 시스템 리소스가 부족해질 수 있습니다. 브로커는 클라이언트의 연결이 가비지 수집 시 제대로 종료되지 않았음을 감지합니다. 그런 다음 연결이 닫히고 아래 것과 유사한 메시지가 로그에 기록됩니다. 로그는 클라이언트 세션이 인스턴스화된 정확한 코드 행을 캡처합니다.The log captures the exact line of code where the client session was instantiated. 이를 통해 오류를 식별하고 수정할 수 있습니다.

[Finalizer] 20:14:43,244 WARNING [org.apache.activemq.artemis.core.client.impl.DelegatingSession]  I'm closing a JMS Conection you left open. Please make sure you close all connections explicitly before let
ting them go out of scope!
[Finalizer] 20:14:43,244 WARNING [org.apache.activemq.artemis.core.client.impl.DelegatingSession]  The session you didn't close was created here:
java.lang.Exception
   at org.apache.activemq.artemis.core.client.impl.DelegatingSession.<init>(DelegatingSession.java:83)
   at org.acme.yourproject.YourClass (YourClass.java:666) 1
1
연결이 인스턴스화된 클라이언트 코드의 줄입니다.

클라이언트 Side에서 Dead Connections 탐지

브로커에서 데이터를 수신하는 동안 클라이언트는 연결을 활성으로 간주합니다. client-failure-check-period 속성에 값을 제공하여 클라이언트가 실패 여부를 확인하도록 클라이언트를 구성합니다. 네트워크 연결의 기본 점검 기간은 30000밀리초이며 In-VM 연결의 기본값은 -1 이지만 데이터가 수신되지 않으면 클라이언트가 해당 쪽에서 연결이 실패하지 않음을 의미합니다.

일반적으로 검사 기간을 브로커의 연결 시간 간 라이브에 사용된 값보다 훨씬 낮게 설정하여 클라이언트가 일시적인 오류 발생 시 클라이언트가 다시 연결할 수 있도록 합니다.

아래 예제에서는 코어 JMS 클라이언트를 사용하여 검사 기간을 10000밀리초로 설정하는 방법을 보여줍니다.

절차

  • dead connections를 탐지하기 위한 검사 기간을 설정합니다.

    • 코어 JMS 클라이언트와 함께 JNDI를 사용하는 경우 JNDI 컨텍스트 환경(예: jndi.properties ) 내에서 확인 기간을 설정합니다.

      java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
      connectionFactory.myConnectionFactory=tcp://localhost:61616?clientFailureCheckPeriod=10000
    • JNDI를 사용하지 않는 경우 ActiveMQConnectionFactory.setClientFailureCheckPeriod() 에 값을 전달하여 검사 기간을 직접 설정합니다.

      ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
      cf.setClientFailureCheckPeriod(10000);

9.1. 연결 시간-투-Live

클라이언트와 서버 간의 네트워크 연결이 실패하고 다시 온라인 상태가 되므로 클라이언트가 다시 연결할 수 있으므로 AMQ Broker는 비활성 서버 쪽 리소스를 정리하도록 기다립니다. 이 대기 기간을 TTL(Time-to-Live)이라고 합니다. 네트워크 기반 연결의 기본 TTL은 60000 밀리초(1분)입니다. In-VM 연결의 기본 TTL은 -1 이며, 이는 브로커가 브로커 측의 연결을 시간 초과하지 않음을 의미합니다.

브로커에서 Time-To-Live 구성

클라이언트가 자체 연결 TTL을 지정하지 않으려면 브로커 측에서 글로벌 값을 설정할 수 있습니다. 브로커 구성에서 connection-ttl-override 요소를 지정하여 이 작업을 수행할 수 있습니다.

TTL 위반에 대한 연결을 확인하는 논리는 connection-ttl-check-interval 요소에 의해 결정된 대로 브로커에서 정기적으로 실행됩니다.

절차

  • connection-ttl-override 구성 요소를 추가하고 아래 예제와 같이 TTL-to-live 값을 제공하여 BROKER_INSTANCE_DIR/etc/broker.xml을 편집합니다.

    <configuration>
     <core>
      ...
      <connection-ttl-override>30000</connection-ttl-override> 1
      <connection-ttl-check-interval>1000</connection-ttl-check-interval> 2
      ...
     </core>
    </configuration>
    1
    모든 연결의 글로벌 TTL은 30000밀리초로 설정됩니다. 기본값은 -1 이며, 이를 통해 클라이언트가 자체 TTL을 설정할 수 있습니다.
    2
    dead connections에 대한 검사 간격은 1000밀리초로 설정됩니다. 기본적으로 검사는 2000밀리초마다 수행됩니다.

클라이언트에서 Time-To-Live 구성

기본적으로 클라이언트는 자체 연결에 대한 TTL을 설정할 수 있습니다. 아래 예제에서는 코어 JMS 클라이언트를 사용하여 Time-To-Live를 설정하는 방법을 보여줍니다.

절차

  • 클라이언트 연결에 대한 Time-To-Live를 설정합니다.

    • JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우, connectionTTL 매개변수를 사용하여 xml config에 지정할 수 있습니다.

      java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
      connectionFactory.myConnectionFactory=tcp://localhost:61616?connectionTTL=30000
    • JNDI를 사용하지 않는 경우 연결 TTL은 ActiveMQConnectionFactory 인스턴스의 ConnectionTTL 속성으로 정의됩니다.

      ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
      cf.setConnectionTTL(30000);