14.7. 클라이언트 연결 파티셔닝
클라이언트 연결을 분할하려면 클라이언트가 연결을 시작할 때마다 개별 클라이언트에 대한 라우팅 연결이 포함됩니다.
클라이언트 연결 파티션의 두 가지 사용 사례는 다음과 같습니다.
- 의도하지 않은 서브스크립션의 클라이언트 파티셔닝을 통해 구독자가 항상 불안정한 구독자 큐가 있는 브로커에 연결할 수 있습니다.
- 데이터 중력이라고도 하는 데이터에 고객을 유치하여 데이터 이동의 필요성을 최소화합니다.
조정된 서브스크립션
장악한 서브스크립션은 브로커의 큐로 표현되며, 장엄한 구독자가 먼저 브로커에 연결될 때 생성됩니다. 이 큐는 브로커에 남아 있으며 클라이언트가 구독 해제될 때까지 메시지가 수신됩니다. 따라서 클라이언트가 동일한 브로커에 반복적으로 연결하여 구독자 큐에 있는 메시지를 소비합니다.
미지의 서브스크립션 대기열에 맞게 클라이언트를 분할하려면 클라이언트 연결에서 클라이언트 ID를 필터링할 수 있습니다.
데이터 중력
데이터 중력도 고려하지 않고 환경에서 브로커 수를 늘리는 경우 브로커 간에 메시지를 이동해야 하기 때문에 일부 성능 이점이 손실됩니다. 날짜 변동을 지원하려면 클라이언트 사용자가 사용해야 하는 메시지가 생성되는 브로커에 연결하도록 클라이언트 연결을 분할해야 합니다.
데이터 중요도를 지원하기 위해 클라이언트 연결을 분할하려면 클라이언트 연결의 다음 속성 중 하나를 필터링할 수 있습니다.
- 연결 사용자(ROLE_NAME)에 할당된 역할
- 사용자 이름 (USER_NAME)
- 클라이언트의 호스트 이름(SNI_HOST)
- 클라이언트의 IP 주소(SOURCE_IP)
14.7.1. Fluentd 서브스크립션을 지원하기 위해 클라이언트 연결 파티셔닝
미완성 서브스크립션을 위해 클라이언트를 분할하려면 일관된 해시 알고리즘 또는 정규식을 사용하여 들어오는 연결에서 클라이언트 ID를 필터링할 수 있습니다.
사전 요구 사항
클라이언트는 로드 밸런서를 사용하거나 모든 브로커 인스턴스를 연결 URL에 구성하여 클러스터의 모든 브로커에 연결할 수 있도록 구성됩니다. 클라이언트 세부 정보가 해당 브로커의 파티션 구성과 일치하지 않기 때문에 브로커가 연결을 거부하면 클라이언트는 클러스터의 다른 브로커에 연결하여 연결을 수락하는 브로커를 찾을 수 있어야 합니다.
14.7.1.1. 일관된 해시 알고리즘을 사용하여 클라이언트 ID 필터링
일관된 해시 알고리즘을 사용하여 각 클라이언트 연결에서 클라이언트 ID를 해시하도록 클러스터의 각 브로커를 구성할 수 있습니다. 브로커가 클라이언트 ID를 해시한 후 해시된 값에 대해 modulo 작업을 수행하여 클라이언트 연결에 대한 대상 브로커를 식별하는 정수 값을 반환합니다. 브로커는 반환된 정수 값을 브로커에 구성된 고유 값과 비교합니다. 일치 항목이 있는 경우 브로커는 연결을 허용합니다. 값이 일치하지 않으면 브로커는 연결을 거부합니다. 클러스터의 각 브로커에서 이 프로세스가 일치가 발견되고 브로커가 연결을 수락할 때까지 반복됩니다.
절차
-
첫 번째
브로커에 대해 <broker_instance_dir> /etc/broker.xml
구성 파일을 엽니다. connection-routers
요소를 생성하고 일관된 해시 알고리즘을 사용하여 클라이언트 ID를 필터링할connection-route
를 생성합니다. 예를 들면 다음과 같습니다.<configuration> <core> ... <connection-routers> <connection-route name=”consistent-hash-routing”> <key>CLIENT_ID</target-key> <local-target-filter>NULL|0</local-target-filter> <policy name="CONSISTENT_HASH_MODULO"> <property key="modulo" value="<number_of_brokers_in_cluster>"> </property> </policy> </connection-route> </connection-routers> ... </core> </configuration>
connection-route
-
connection-route name
에게 이 연결 라우팅 구성에 대해 식별 문자열을 지정합니다. 일관된 해시 필터를 적용하려면 각 브로커 어셉터에 이 이름을 추가해야 합니다. key
-
필터를 적용할 키 유형입니다. 클라이언트 ID를 필터링하려면
키
필드에CLIENT_ID
를 지정합니다. local-target-filter
-
브로커가 modulo 작업에서 반환된 정수 값과 비교하여 일치 항목이 있고 브로커가 연결을 수락할 수 있는지 여부를 결정합니다. 이 예제의
NULL|0
값은 클라이언트 ID (NULL)가 없는 연결과 modulo 작업에서 반환한 숫자가0
인 연결에 대한 일치를 제공합니다. policy
대상 브로커를 식별하기 위해 해시된 클라이언트 ID에서
modulo
작업을 수행하는 modulo 속성 키를 수락합니다.modulo
속성 키의 값은 클러스터의 브로커 수와 같아야 합니다.중요정책 이름은
CONSISTENT_HASH_MODULO
이어야 합니다.
-
두 번째
브로커의 <broker_instance_dir> /etc/broker.xml
구성 파일을 엽니다. connection-routers
요소를 생성하고 일관된 해시 알고리즘을 사용하여 클라이언트 ID를 필터링하는연결 경로
를 생성합니다.다음 예제에서
NULL|1
의local-target-filter
값은 클라이언트 ID(NULL)가 없는 연결과 modulo 작업에서 반환한 값이1
인 연결에 대한 일치를 제공합니다.<configuration> <core> ... <connection-routers> <connection-route name=”consistent-hash-routing”> <key>CLIENT_ID</target-key> <local-target-filter>NULL|1</local-target-filter> <policy name="CONSISTENT_HASH_MODULO"> <property key="modulo" value="<number_of_brokers_in_cluster>"> </property> </policy> </connection-route> </connection-routers> ... </core> </configuration>
- 클러스터의 각 추가 브로커에 대해 일관된 해시 필터를 생성하려면 이 절차를 반복합니다.
14.7.1.2. 정규식을 사용하여 클라이언트 ID 필터링
클라이언트 연결의 클라이언트 ID 부분에 정규식 필터를 적용하도록 브로커를 구성하여 클라이언트 연결을 분할할 수 있습니다. 브로커는 정규식 필터의 결과가 브로커에 대해 구성된 로컬 대상 필터와 일치하는 경우에만 연결을 수락합니다. 일치 항목이 없는 경우 브로커는 연결을 거부합니다. 클러스터의 각 브로커에서 이 프로세스가 일치가 발견되고 브로커가 연결을 수락할 때까지 반복됩니다.
사전 요구 사항
- 정규식으로 필터링할 수 있는 각 클라이언트 ID의 공통 문자열입니다.
절차
-
첫 번째
브로커에 대해 <broker_instance_dir> /etc/broker.xml
구성 파일을 엽니다. connection-routers
요소를 생성하고 클라이언트 ID의 일부를 필터링할connection-route
를 생성합니다. 예를 들면 다음과 같습니다.<configuration> <core> ... <connection-routers> <connection-route name=”regex-routing”> <key>CLIENT_ID</target-key> <key-filter>^.{3}</key-filter> <local-target-filter>NULL|FOO</local-target-filter> </connection-route> </connection-routers> ... </core> </configuration>
connection-route
-
connection-route name
에게 이 라우팅 구성에 대한 식별 문자열을 지정합니다. 정규식 필터를 적용하려면 각 브로커 어셉터에 이 이름을 추가해야 합니다. key
-
필터를 적용할 키입니다. 클라이언트 ID를 필터링하려면
키
필드에CLIENT_ID
를 지정합니다. key-filter
키 값을 추출하기 위해 정규식이 적용되는 클라이언트 ID 문자열의 일부입니다. 위의 첫 번째 브로커 예제에서 브로커는 클라이언트 ID의 처음 3자인 키 값을 추출합니다. 예를 들어 클라이언트 ID 문자열이
FOO100.consumer
인 경우 브로커는FOO
의 키 값을 추출합니다. 브로커가 키 값을 추출한 후 이를local-target-filter
의 값과 비교합니다.들어오는 연결에 클라이언트 ID가 없거나 브로커가 키
-필터
에 지정된 정규식을 사용하여 키 값을 추출할 수 없는 경우 키 값은 NULL로 설정됩니다.local-target-filter
-
브로커가 키 값과 비교하여 일치 항목이 있고 브로커에서 연결을 수락할 수 있는지 확인하는 값입니다. 위의 첫 번째 브로커의 예에 표시된 대로
NULL|FOO
값은 클라이언트 ID(NULL)가 없거나 클라이언트 ID에FOO
의 3자 접두사가 없는 연결과 일치합니다.
-
두 번째
브로커의 <broker_instance_dir> /etc/broker.xml
구성 파일을 엽니다. connection-routers
요소를 만들고 클라이언트 ID의 일부를 기반으로 연결을 필터링할 연결경로
를 만듭니다.다음 필터 예제에서 브로커는 정규식을 사용하여 클라이언트 ID의 처음 3자인 키 값을 추출합니다. 브로커는
NULL
과BAR
의 값을 키 값과 비교하여 일치 항목이 있고 브로커가 연결을 수락할 수 있는지 확인합니다.<configuration> <core> ... <connection-routers> <connection-route name=”regex-routing”> <key>CLIENT_ID</target-key> <key-filter>^.{3}</key-filter> <local-target-filter>NULL|BAR</local-target-filter> </connection-route> </connection-routers> ... </core> </configuration>
- 이 절차를 반복하고 클러스터의 각 추가 브로커에 대해 적절한 연결 라우팅 필터를 생성합니다.
14.7.2. 데이터 중력 지원을 위해 클라이언트 연결 파티셔닝
날짜 변동을 지원하기 위해 클라이언트 소비자가 소비해야 하는 메시지가 생성되는 브로커에 연결하도록 클라이언트 연결을 분할할 수 있습니다. 예를 들어 생산자 및 소비자 애플리케이션에서 사용하는 주소 집합이 있는 경우 특정 브로커에서 주소를 구성할 수 있습니다. 그런 다음 해당 주소를 사용하는 생산자와 소비자 모두 클라이언트 연결을 파티셔닝하여 해당 브로커에만 연결할 수 있습니다.
연결된 사용자에게 할당된 역할, 사용자의 사용자 이름 또는 클라이언트의 호스트 이름 또는 IP 주소와 같은 속성을 기반으로 클라이언트 연결을 분할할 수 있습니다. 이 섹션에서는 클라이언트 사용자에게 할당된 사용자 역할을 필터링하여 클라이언트 연결을 분할하는 방법의 예를 보여줍니다. 클라이언트가 브로커에 연결하기 위해 인증해야 하는 경우 역할 기준과 일치하는 사용자만 브로커에 연결할 수 있도록 클라이언트 사용자에게 역할을 할당하고 연결을 필터링할 수 있습니다.
사전 요구 사항
- 클라이언트는 로드 밸런서를 사용하거나 모든 브로커 인스턴스를 연결 URL에 구성하여 클러스터의 모든 브로커에 연결할 수 있도록 구성됩니다. 클라이언트가 해당 브로커에 대해 구성된 파티션 필터 기준과 일치하지 않기 때문에 브로커가 연결을 거부하면 클라이언트는 클러스터의 다른 브로커에 연결하여 연결을 수락하는 브로커를 찾을 수 있어야 합니다.
절차
-
첫 번째
브로커의 <broker_instance_dir> /etc/artemis-roles.properties
파일을 엽니다.broker1users
역할을 추가하고 역할에 사용자를 추가합니다. -
첫 번째
브로커에 대해 <broker_instance_dir> /etc/broker.xml
구성 파일을 엽니다. connection-routers
요소를 만들고 사용자에게 할당된 역할에 따라 연결을 필터링할connection-route
를 만듭니다. 예를 들면 다음과 같습니다.<configuration> <core> ... <connection-routers> <connection-route name=”role-based-routing”> <key>ROLE_NAME</target-key> <key-filter>broker1users</key-filter> <local-target-filter>broker1users</local-target-filter> </connection-route> </connection-routers> ... </core> </configuration>
connection-route
-
connection-route name
에게 이 라우팅 구성에 대한 식별 문자열을 지정합니다. 역할 필터를 적용하려면 각 브로커 어셉터에 이 이름을 추가해야 합니다. key
-
필터를 적용할 키입니다. 역할 기반 필터링을 구성하려면
키
필드에ROLE_NAME
을 지정합니다. key-filter
-
브로커가 사용자 역할을 필터링하고 키 값을 추출하는 데 사용하는 문자열 또는 정규식입니다. 브로커가 일치하는 역할을 발견하면 키 값을 해당 역할로 설정합니다. 일치하는 역할을 찾지 못하면 브로커는 키 값을 NULL로 설정합니다. 위 예제에서 브로커는
broker1users
필터를 클라이언트 사용자 역할에 적용합니다. 브로커가 키 값을 추출한 후 이를local-target-filter
의 값과 비교합니다. local-target-filter
-
브로커가 키 값과 비교하여 일치 항목이 있고 브로커에서 연결을 수락할 수 있는지 확인하는 값입니다. 이 예제에서 브로커는
broker1users
의 값을 키 값과 비교합니다. 이는 사용자에게broker1users
역할이 있고 브로커는 연결을 수락한다는 것을 의미합니다.
- 이 절차를 반복하고 필터에서 적절한 역할을 지정하여 클러스터의 다른 브로커의 클라이언트를 분할합니다.
14.7.3. 어셉터에 연결 경로 추가
브로커에서 연결 경로를 구성한 후 클라이언트 연결을 분할하기 위해 브로커의 어셉터 중 하나 이상에 경로를 추가해야 합니다. 연결 경로를 수락자에 추가한 후 브로커는 연결 경로에 구성된 필터를 수락자가 수신한 연결에 적용합니다.
절차
-
첫 번째
브로커에 대해 <broker_instance_dir> /etc/broker.xml
구성 파일을 엽니다. 파티셔닝을 활성화하려는 각 어셉터에 대해
라우터
키를 추가하고connection-route 이름을
지정합니다. 다음 예에서는consistent-hash
-routing
의 connection-route 이름이artemis
acceptor에 추가됩니다.<configuration> <core> ... <acceptors> ... <!-- Acceptor for every supported protocol --> <acceptor name="artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;router="consistent-hash-routing" </acceptor> </acceptors> ... </core> </configuration>
- 클러스터의 각 브로커에 대해 적절한 연결 경로 필터를 지정하려면 이 절차를 반복합니다.