JEUS MQ 서버 설정

본 장에서는 JEUS MQ 서버를 실행하기 위한 JMS 엔진과 리소스 설정 방법에 대해서 설명한다.

1. 개요

JEUS MQ 서버는 JMS 엔진으로 표현되며, 서버 당 하나의 JMS 엔진이 실행될 수 있다. JEUS의 각 구성 요소에 대한 설명은 JEUS Server 안내서의 소개를 참고한다.

1.1. 디렉터리 구조

다음은 JEUS 및 JEUS MQ 서버를 설정하고 관리하기 위한 파일들의 위치를 보여준다. JEUS_HOME은 JEUS가 설치된 경로를 나타낸다.

{JEUS_HOME}
   |--bin
   |   |--[01]jeusadmin
   |--logs

* Legend
- [01]: binary or executable file
- [X] : XML document
- [J] : JAR file
- [T] : Text file
- [C] : Class file
- [V] : java source file
- [DD] : deployment descriptor
jeusadmin

JEUS Manager를 관리하기 위한 콘솔 툴이다. JEUS Manager와 서버 제어를 포함해 JEUS 전반에 대한 관리 기능을 제공한다. 자세한 사용법은 JEUS Reference 안내서의 jeusadmin을 참고한다.

2. JMS 리소스 설정

Jms Resource은 다음의 2개 요소로 구성된다.

  • Destination

    JEUS MQ 서버 내의 Destination에 관한 설정이다. Queue나 Topic과 같은 Destination 역시 JEUS MQ 서버가 기동할 때 도메인 설정을 읽어 JEUS JNDI 서비스에 등록한다. 자세한 설정 방법은 Destination 설정을 참고한다.

  • Durable Subscription

    JEUS MQ 서버 내의 Durable Subscription에 관한 설정이다. 자세한 설정 방법은 Durable Subscription 설정을 참고한다.

2.1. Destination 설정

Queue나 Topic과 같은 Destination 역시 JEUS MQ 서버가 기동할 때 도메인 설정을 읽어 JEUS JNDI 서비스에 등록한다.

기본 설정

다음은 domain.xml에서 Destination을 기본적으로 설정하는 예이다. 설정 값은 <destination> 태그 안에 구성한다.

domain.xml
<domain>
  ...
    <jms-resource>
        <destination>
            <type>queue</type>
            <name>ExamplesQueue</name>
            <export-name>jms/ExamplesQueue</export-name>
        </destination>

        <destination>
            <type>topic</type>
            <name>ExamplesTopic</name>
            <export-name>jms/ExamplesTopic</export-name>
        </destination>
    </jms-resource>
</domain>

다음은 설정 태그에 대한 설명이다.

태그 설명

<type>

Destination의 타입이다. queue와 topic 중 하나를 지정할 수 있다.

<export-name>

Destination은 Connection Factory와 마찬가지로 <export-name>으로 JNDI Lookup 할 수 있다. <export-name>을 지정하지 않으면 <name> 값이 사용된다.

메시지 흐름 제어 설정

메시지 수신자가 Destination에 Message Listener를 등록한 경우 JEUS MQ 서버는 Destination에 메시지가 도착하면 해당 클라이언트에게 메시지를 전송한다. 그런데 서버가 메시지를 전송하는 속도보다 클라이언트에서 메시지를 처리하는 속도가 느리면 클라이언트 메모리에 메시지가 계속해서 쌓이게 되고, 결국 클라이언트 JVM에서 OutOfMemoryError가 발생할 수 있다. 이와 같은 상황을 방지하기 위해 클라이언트 측에 아직 처리되지 않고 쌓여 있는 메시지의 최대 개수를 설정하여 이 개수를 초과하면 서버가 클라이언트로 잠시 동안 메시지를 전송하지 않도록 할 수 있다.

다음은 domain.xml에서 Destination별로 메시지 흐름 제어 설정을 정의한 예이다. 설정 값은 <destination> 태그 안에 구성한다.

domain.xml
<domain>
  ...
    <jms-resource>
        <destination>
            <type>queue</type>
            <name>ExamplesQueue</name>
            <export-name>jms/ExamplesQueue</export-name>
            <max-pending-limit>1000</max-pending-limit>
            <resume-dispatch-factor>0.5</resume-dispatch-factor>
        </destination>
    </jms-resource>
</domain>

다음은 설정 태그에 대한 설명이다.

태그 설명

<max-pending-limit>

메시지의 최대 개수이다. (기본값: 8192)

<resume-dispatch-factor>

<max-pending-limit> 설정에 따라 JEUS MQ 서버가 클라이언트로 메시지 전송을 멈춘 경우 클라이언트에 쌓인 메시지 개수가 <max-pending-limit> 값의 어느 비율까지 줄어들었을 때 메시지 전송을 재개할지 지정한다. (기본값: 0.4)

위의 예시와 같이 설정한 경우에는 클라이언트에 쌓인 메시지가 1,000개일 때 서버가 메시지 전송을 멈추고, 메시지 개수가 500개로 줄어들면 메시지 전송을 재개한다.

2.2. Durable Subscription 설정

일반적으로 Durable Subscriber는 클라이언트가 생성하기 때문에 생성 이전에 Topic에 도착한 메시지는 클라이언트에게 전달되지 않는다. 이런 상황을 방지하기 위해 JEUS MQ는 Durable Subscription을 설정하여 서버가 실행될 때 미리 Durable Subscription을 등록해두었다가 조건에 맞는 클라이언트가 접속했을 때 Durable Subscriber로 메시지를 전달하는 기능을 제공한다. Session.createDurableSubscriber() 메소드를 호출할 때 클라이언트 ID와 Subscription 이름 및 Topic이 필요한 것처럼 domain.xml에서 Durable Subscription을 설정할 때도 동일한 항목을 설정해야 한다. 추가로 Message Selector도 설정할 수 있다.

domain.xml
<domain>
  ...
    <jms-resource>
        <durable-subscription>
            <client-id>client_id1</client-id>
            <name>subscription1</name>
            <destination-name>ExamplesTopic</destination-name>
        </durable-subscription>
    </jms-resource>
</domain>

3. JMS Quota 설정

3.1. Quota 설정

Destination에 클라이언트에게 전달되지 않은 메시지가 계속해서 늘어나면 JVM이 OutOfMemoryError를 내면서 서버가 종료될 수 있다. 이를 방지하기 위해 JEUS MQ는 Quota 설정을 통해 JMS Destination별 메모리 관리를 위한 Quota를 설정 할 수 있는 방법을 제공한다.

Destination이 많은 메모리를 사용하고 있지 않을 때 JEUS MQ 서버는 메시지 내용에 대한 Strong Reference를 가지고 있다. JMS Destination 내에 'Quota'를 지정하면 메모리 사용량에 따라 JEUS MQ 서버는 다음과 같이 동작한다.

  • Destination이 사용하고 있는 메모리가 'Quota' 설정값 이상이면 클라이언트의 메시지 송신 시도는 실패하고 JMSException이 발생한다.

  • Destination이 사용하고 있는 메모리가 'Quota' 설정값의 75%이상이면 저장소에 저장한 메시지의 내용은 메모리에서 관리하지 않는다.

Destination에 도착한 메시지의 내용이 메모리에서 삭제되어도 메시지는 유실되지 않는다. 메시지는 저장소에 저장되어 있기 때문에 JEUS MQ 서버는 필요할 때 메시지 내용을 저장소로부터 읽어서 처리한다. 이 경우 처리 속도는 메시지 내용이 메모리에 있을 때보다 느릴 수 밖에 없다.

JEUS MQ 서버는 저장소에 저장하지 않은 메시지 내용을 항상 메모리에 가지고 있으므로, 'Quota'에 의한 설정은 저장소가 설정되어 있고 메시지를 DeliveryMode.PERSISTENT로 지정한 경우에만 영향을 미친다.

Quota를 설정한 후에 Destination에서 Quota 기능을 사용하도록 설정할 수 있다. 자세한 내용은 Destination 설정을 참고한다.

4. JMS 엔진 설정

domain.xml 파일을 작성하는 것으로 JMS 엔진 설정을 할 수 있다.

4.1. 기본 정보 설정

JEUS MQ 서버는 <jms-engine>에서 설정할 수 있다. JMS 엔진은 해당 서버에서 JMS 서버를 사용하기 위한 환경을 제공한다. 서버가 부팅될 때 실행되며, 하나의 서버에서는 하나의 JMS 엔진만 지원한다.

JMS 엔진은 Engine Roll 등에 해당하는 기본 선택사항 및 JEUS MQ 서버의 Failover, Quota와 JMS 엔진의 고급 선택사항까지 설정할 수 있다. 상단의 Failover 설정에서는 서버나 네트워크에 장애가 발생하는 경우 이를 복구하는 정보를 설정한다. Failover 설정에 대한 자세한 내용은 JEUS MQ 장애 극복을 참고한다.

  • 엔진 메모리 관리

    JMS 엔진 기본 선택사항의 'Max Bytes', 'Max Messages' 항목은 JMS 엔진의 메모리 관리를 위한 Quota 정보를 설정한다.JEUS MQ 서버는 서버 내 모든 Destination의 메모리를 통괄하는 JMS 엔진의 Quota 설정과 각 Destination의 Quota 설정 정보를 사용하여 메모리를 관리한다. 메모리 관리 정책에 대한 자세한 내용은 JMS Quota 설정을 참고한다.

    다음은 엔진 메모리와 관련된 부분을 서버에 설정한 예시이다.

    domain.xml
    <domain>
      ...
        <jms-engine>
            <max-byte>128M</max-byte>
            <max-message>0</max-message>
        </jms-engine>
    </domain>

    다음은 설정 태그에 대한 설명이다.

    태그 설명

    <max-byte>

    JMS Engine에서 사용할 수 있는 최대 메모리 크기를 설정한다. 숫자 뒤에 'K'(KiloBytes), 'M'(MegaBytes), 'G'(GigaBytes)를 붙여 설정할 수 있다. (기본값: 128MBytes)

    <max-message>

    JMS Engine에서 사용할 수 있는 최대 메시지 수를 설정한다. 설정하지 않으면 메시지 수를 제한하지 않는다.

  • 고급 선택사항 설정

    JMS 엔진 고급 선택사항에서는 JEUS MQ 서버가 사용하는 Thread에 대한 정보를 설정한다.

    JMS 엔진의 메시지 처리 방식은 크게 두 가지로 나뉜다. 먼저, 일반적인 메시지는 순서 보장과 동시처리에 따른 경쟁을 피하기 위해 Event manager에 의해 Single Thread로 처리된다. 그외의 특수 기능, 클러스터간 메시지 전송, 트랜잭션 제어, JMS 엔진 제어를 위한 메시지 등은 각 형태에 따라 Thread pool의 Thread로 처리하고 있다.

    다음은 Thread에 대한 정보를 서버에 설정한 예시이다.

    domain.xml
    <domain>
      ...
        <jms-engine>
            <thread-pool>
                 <min>10</min>
                 <max>20</max>
                 <keep-alive-time>300</keep-alive-time>
            </thread-pool>
        </jms-engine>
    </domain>

    다음은 설정 태그에 대한 설명이다.

    태그 설명

    <min>

    Thread pool의 최소 크기를 지정한다.

    <max>

    Thread pool의 최대 크기를 지정한다.

    <keep-alive-time>

    min 설정 개수를 초과하는 Thread들 중에서 여기에 지정된 시간 동안 사용되지 않은 것은 소멸된다. (단위: 초, 기본값: 300)

4.2. 서비스 채널 설정

JEUS MQ 서버는 서비스 채널(Service Channel)을 통해서 클라이언트와 통신한다. 하나의 JEUS MQ 서버에는 최소한 하나의 서비스 채널이 있어야 하며 각 서비스 채널마다 서비스 URL 등의 네트워크 설정을 다르게 지정할 수 있다.

서비스 채널이 사용하는 리스너의 이름은 <service-config> 하위의 <listener-name>에서 설정한다. 리스너 설정에 대한 자세한 설명은 JEUS Server 안내서의 Listener 설정을 참고한다.

다음은 서비스 채널을 서버에 설정한 예시이다.

domain.xml
<domain>
  ...
    <jms-engine>
        <service-config>
             <name>default</name>
             <listener-name>jms</listener-name>
             <client-limit>1000</client-limit>
             <client-keepalive-timeout>20</client-keepalive-timeout>
        </service-config>
    </jms-engine>
</domain>

다음은 설정 태그에 대한 설명이다. 메시징 서비스를 제공하기 위한 서비스 채널에 대한 설정으로 최소한 하나 이상 설정되어야 한다.

태그 설명

<name>

서비스 채널의 이름을 설정한다. Connection Factory에 채널 정보를 지정하기 위해 설정한다.

<listener-name>

서비스 채널의 Listener를 지정한다. 서버에 이미 존재하는 설정들에 있는 이름을 설정한다. 설정하지 않으면 Base-listener가 선택된다.

<client-limit>

서비스 채널이 허용하는 최대 클라이언트 수를 지정한다.

<client-keepalive-timeout>

클라이언트와의 연결이 비정상 종료되었을 경우 재접속을 기다리는 시간이다. 설정한 시간이 지나면 해당 클라이언트의 리소스는 모두 서버에 반환된다. 설정된 시간 내에는 해당 클라이언트의 clientID 값이 유지되므로 네트워크 상태가 불량한 경우에만 설정한다. 초 단위로 설정하며 0 이하의 값을 지정하면 기다리지 않고 즉시 리소스를 반환한다.

4.3. Connection Factory 설정

Connection Factory는 JMS 관리 객체로 클라이언트가 JMS 서버에 접속하는 데 필요한 연결 설정 정보와 클라이언트를 위한 기본 정보들을 가지고 있다. JEUS MQ 서버가 기동될 때 생성되어 JEUS JNDI 서비스에 등록된다.

다음은 Connection Factory를 서버에 설정한 예시이다.

domain.xml
<domain>
  ...
    <jms-engine>
        <connection-factory>
            <type>nonxa</type>
            <name>ConnectionFactory</name>
            <export-name>jms/ConnectionFactory</export-name>
        </connection-factory>
    </jms-engine>
</domain>

다음은 설정 태그에 대한 설명이다.

태그 설명

<type>

해당 Connection Factory의 종류를 설정한다.

<name>

JMS 시스템 내에서 관리의 목적으로 사용되는 Connection Factory의 이름이다.

<export-name>

해당 Connection Factory가 Naming Server에 바인딩되는 이름을 설정한다. 설정하지 않으면 Name 속성이 그대로 사용된다.

4.4. Persistence Store 설정

Persistence Store는 서버가 재기동될 때 메시지나 Subscription, 트랜잭션들의 이전 상태를 복구하기 위해 필요하다. Persistence Store를 설정하지 않으면 클라이언트에서 DeliveryMode.PERSISTENT 방식으로 메시지를 송신한 경우에 서버에서 장애가 발생했을 때 메시지 전달을 보장할 수 없다. JEUS MQ에서 제공하는 Persistence Store의 종류에는 저널 로그와 데이터베이스가 있다.

Persistence Store 설정은 <jms-engine> 하위의 <persistence-store>에서 할 수 있다.

다음은 Persistence Store를 서버에 설정한 예시이다.

domain.xml
<domain>
  ...
    <jms-engine>
        <persistence-store>
          <journal>
            <base-dir>/home/example/store/jeusmq</base-dir>
            <!--<initial-log-file-count>5</initial-log-file-count>-->
            <!--<max-log-file-count>10</max-log-file-count>-->
            <!--<log-file-size>128M</log-file-size>-->
            <!--<property>-->
              <!--<key>jeus.store.journal.overflow-factor</key>-->
              <!--<value>0.3</value>-->
            <!--</property>-->
          </journal>
          <!--<jdbc>-->
            <!--<data-source>datatsource1</data-source>-->
            <!--<vendor>oracle</vendor>-->
            <!--<destination-table>TEST_DEST</destination-table>-->
            <!--<durable-subscriber-table>TEST_DSUB</durable-subscriber-table>-->
            <!--<message-table>TEST_MESG</message-table>-->
            <!--<subscription-message-table>TEST_SMSG</subscription-message-table>-->
            <!--<transaction-table>TEST_TRAN</transaction-table>-->
          <!--</jdbc>-->
        </persistence-store>
    </jms-engine>
</domain>

다음은 <persistence-store>의 Store 설정과 관련된 하위 태그에 대한 설명이다.

  • <journal>

    저널 로그 방식을 사용한다.

    태그 설명

    <base-dir>

    Store를 생성할 디렉터리 이름을 설정한다. 이 디렉터리 이름은 각 Store별로 유일해야 한다.

    <initial-log-file-count>

    Journal Store를 생성할 때 초기에 생성할 로그 파일의 개수를 설정한다.

    <max-log-file-count>

    최대로 생성할 로그 파일의 개수를 설정한다.

    <log-file-size>

    로그 파일의 크기를 지정한다. Integer 타입의 값이나 숫자 뒤에 'K'(KiloBytes), 'M'(MegaBytes), 'G'(GigaBytes)를 붙여 설정할 수 있다.

  • <jdbc>

    데이터베이스 방식을 사용한다. 현재 호환 가능한 외부 데이터베이스는 'Oracle Database 9i 이상(Enterprise Edition)', 'Tibero 3 SP2 이상', 'Altibase 4.x(5 이상은 지원하지 않음)'이다.

    'Data Source' 항목에 설정된 값은 Persistence Store로 사용할 데이터소스의 JNDI 이름이다. JEUS에 데이터소스를 추가하는 방법은 DB Connection Pool과 JDBC를 참고한다.

    위와 같이 설정하는 경우 해당 데이터베이스 내의 테이블 이름을 변경할 수 있다. 이 태그들을 사용하면 운용 중인 서버에서 테스트를 수행하는 경우 별도의 Persistence Store를 설치하지 않고도 사용하는 테이블의 이름만 바꿔서 JEUS MQ 서버를 테스트하는 것이 가능하다. 테이블의 이름을 설정하지 않는 경우 기본적으로 <SERVER-NAME>_DEST, <SERVER-NAME>_DSUB, <SERVER-NAME>_MESG, <SERVER-NAME>_SMSG, <SERVER-NAME>_TRAN이라는 이름의 테이블을 사용하게 된다. JDBC를 설정했을 때 생성되는 테이블들의 각 컬럼에 대한 설명은 JDBC Persistence Store 컬럼을 참고한다.

    태그 설명

    <data-source>

    DB의 데이터소스를 설정한다.

    <destination-table>

    Destination 테이블 이름을 변경한다. 단, 영문 소문자는 허용되지 않는다.

4.5. Message Sort 설정

Message Sort 기능에 대한 설정은 JEUS MQ Message Sort의 설명을 참고한다.

5. 서버 관리 및 모니터링

JEUS MQ 서버 관리는 다음과 같은 작업을 통해 메시지 유실 없이 지속적인 서비스가 가능하도록 하는 것이다.

  • 운용 중인 JEUS MQ 서버의 리소스 관리 및 모니터링

    다음의 리소스들이 관리 및 모니터링의 대상이 된다.

    • Connection Factory, Destination과 같은 JMS 관리 객체

    • Destination과 Durable Subscription의 메시지

    • 클라이언트에 할당된 커넥션, 세션, 메시지 송/수신자

    • JEUS MQ 서버가 차지하는 메모리 영역

    • JEUS MQ 서버가 사용하는 Persistent Storage

  • 장애 상황에 대처하고 장애로부터 JEUS MQ 서버를 복구

JEUS는 콘솔 툴인 jeusadmin을 제공해서 JEUS MQ 서버 관리 및 모니터링하는 기능을 제공한다. 본 절에서는 각 툴을 사용해서 JEUS MQ 서버를 관리 및 모니터링하는 방법에 대해 설명한다.

5.1. 서버 관리

다음은 콘솔 툴(jeusadmin)을 사용해서 서버를 관리하는 방법에 대한 설명이다.

콘솔 툴 사용

콘솔 툴은 콘솔에서 여러 가지 명령어를 실행해서 서버 관리작업을 수행할 수 있는 툴로 다음의 경로에 위치한다.

JEUS_HOME/bin/

다음은 서버 관리를 위해서 제공되는 명령어 목록이다.

  • Connection Factory 관련

    명령어 설명

    add-jms-connection-factory

    Connection Factory를 추가한다.

    remove-jms-connection-factory

    Connection Factory를 제거한다.

  • Destination 관련

    명령어 설명

    add-jms-destination

    Destination을 추가한다.

    remove-jms-destination

    Destination을 제거한다.

  • Durable Subscription 관련

    명령어 설명

    add-jms-durable-subscription

    Durable Subscription을 추가한다.

    remove-jms-durable-subscription

    Durable Subscription을 제거한다.

명령어에 대한 자세한 설명과 사용법, 사용 예는 JEUS Reference 안내서의 JMS 엔진 관련 명령어를 참고한다.

5.2. 서버 모니터링

본 절에서는 콘솔 툴을 사용해서 서버 모니터링을 하는 방법에 대해 설명한다.

콘솔 툴 사용

콘솔 툴은 콘솔에서 여러 가지 명령어를 실행해서 서버 관리작업을 수행할 수 있는 툴로 다음의 경로에 위치한다.

JEUS_HOME/bin/

다음은 서버 모니터링을 위해서 제공되는 명령어 목록이다.

  • Connection Factory 관련

    명령어 설명

    list-jms-connection-factories

    Connection Factory 목록을 조회하거나 지정된 Conntection Factory의 정보를 출력한다.

  • Destination 관련

    명령어 설명

    list-jms-destinations

    Destination 목록을 조회하거나 지정된 Destination 정보를 출력한다.

    control-jms-destination

    지정된 Destination의 상태를 제어한다.

  • 메시지 관련

    명령어 설명

    list-jms-messages

    지정된 Destination 내의 메시지들의 정보를 조회한다.

    view-jms-message

    지정된 메시지의 상세한 정보를 조회한다.

    move-jms-messages

    지정된 메시지들을 서버나 클러스터 내의 다른 Destination으로 이동한다.

    delete-jms-messages

    지정된 메시지들을 Destination에서 삭제한다.

    export-jms-messages

    지정된 메시지들을 XML 파일 형태로 내보낸다.

    import-jms-messages

    내보내진 XML 파일의 메시지들을 지정된 Destination으로 가져온다.

  • Durable Subscription관련

    명령어 설명

    list-jms-durable-subscriptions

    Durable Subscription 목록을 조회하거나 지정된 Durable Subscription 정보를 조회한다.

  • 클라이언트 관련

    명령어 설명

    list-jms-clients

    클라이언트 목록을 조회하고 정보를 출력한다.

    ban-jms-client

    클라이언트로부터의 연결을 강제로 끊는다.

  • 트랜잭션 관련

    명령어 설명

    list-jms-pending-transactions

    pending 트랜잭션 목록을 출력한다.

    commit-jms-pending-transaction

    지정된 pending 트랜잭션을 강제로 commit한다.

명령어에 대한 자세한 설명과 사용법, 사용 예는 JEUS Reference 안내서의 JMS 엔진 관련 명령어를 참고한다.