Post

우선 순위 큐 패턴

1. 우선 순위 큐 패턴

우선 순위가 높은 요청을 우선 순위가 낮은 요청보다 먼저 받아서 처리하도록 서비스로 전송된 요청의 우선 순위를 지정한다. 이 패턴은 개별 클라이언트에 서로 다른 서비스 수준 보장을 제공하는 애플리케이션에서 유용하다.

2. 컨텍스트 및 문제점

애플리케이션은 특정 작업(예: 백그라운드 처리 수행 또는 다른 애플리케이션이나 서비스와의 통합)을 다른 서비스에 위임할 수 있다. 클라우드에서 메시지 큐는 일반적으로 작업을 백그라운드 처리에 위임하는데 사용된다.

대부분의 경우 서비스에서 주문 요청을 수신하는 것은 중요하지 않다. 그러나 경우에 따라 특정 요청에 대해 우선 순위를 지정해야 한다. 이러한 요청은 이전에 애플리케이션에서 보낸 우선 순위가 낮은 요청보다 먼저 처리해야 한다.

3. 해결 방법

큐는 일반적으로 FIFO(선입 선출) 구조이며, 소비자는 대개 큐에 게시된 것과 동일한 순서로 메시지를 받는다. 그러나 일부 메시지 큐에서는 우선 순위 메시지를 지원한다. 메시지를 게시하는 애플리케이션은 우선 순위를 지정할 수 있으며, 이 경우 큐의 메시지가 자동으로 다시 정렬되어 우선 순위가 높은 메시지가 우선 순위가 낮은 메시지보다 먼저 수신된다.

그림에서는 우선 순위 메시지가 있는 큐를 보여 준다.

priority-queue-pattern

대부분의 메시지 큐 구현은 경쟁 소비자 패턴에 따라 여러 소비자를 지원하며, 수요에 따라 소비자 프로세스의 수를 늘리거나 줄일 수 있니다.

우선 순위 기반 메시지 큐를 지원하지 않는 시스템에서 적용할 수 있는 다른 솔루션은 각 우선 순위마다 별도의 큐를 유지하는 것이다. 애플리케이션은 해당 큐에 메시지를 게시해야 한다. 각 큐에는 별도의 소비자 풀이 있을 수 있다.

우선 순위가 높은 큐는 우선 순위가 낮은 큐보다 더 빠른 하드웨어에서 실행되는 더 큰 소비자 풀을 가질 수 있다. 다음 그림에서는 각 우선 순위마다 별도의 메시지 큐를 사용하는 방법을 보여 준다.

priority-queue-separate

이 전략의 변형은 우선 순위가 높은 큐의 메시지를 먼저 확인한 다음, 우선 순위가 낮은 큐에서 메시지를 가져오기 시작하는 단일 소비자 풀을 갖는 것이다.

단일 소비자 프로세스 풀을 사용하는 솔루션(우선 순위가 다른 메시지를 지원하는 단일 큐 또는 각각 단일 우선 순위의 메시지를 처리하는 큐를 여러 개 사용하는 솔루션) 및 각각 별도의 풀이 있는 큐를 여러 개 사용하는 솔루션 간에는 몇 가지 의미상의 차이가 있다.

단일 풀 접근 방식에서 우선 순위가 높은 메시지는 항상 우선 순위가 낮은 메시지보다 먼저 수신되고 처리된다. 이론적으로, 우선 순위가 매우 낮은 메시지는 지속적으로 대체될 수 있으며, 이로 인해 처리되지 않을 수도 있다.

다중 풀 접근 방식에서 우선 순위가 낮은 메시지는 풀의 상대적 크기와 사용 가능한 리소스에 따라 항상 우선 순위가 높은 메시지만큼 빠르게 처리되지 않는다.

우선 순위 큐 메커니즘을 사용하면 다음과 같은 이점을 제공할 수 있다.

  • 이를 통해 특정 고객 그룹에 서로 다른 수준의 서비스를 제공하는 것과 같이 가용성 또는 성능의 우선 순위를 요구한 비즈니스 요구 사항이 애플리케이션에서 충족될 수 있다.

  • 운영 비용을 최소화할 수 있다. 단일 큐 접근 방식에서는 필요에 따라 소비자의 수를 조정할 수 있다. 우선 순위가 높은 메시지가 먼저 처리되며(다소 느릴 수도 있음), 우선 순위가 낮은 메시지는 더 오래 지연될 수 있다. 각 큐에 대해 별도의 소비자 풀이 있는 여러 메시지 큐 방식을 구현한 경우, 우선 순위가 낮은 큐의 소비자 풀을 줄이거나 이러한 큐의 메시지를 수신 대기하는 모든 소비자를 중지하여 우선 순위가 매우 낮은 큐의 처리를 일시 중단 할 수도 있다.

  • 여러 메시지 큐 방식을 사용하면 처리 요구 사항에 따라 메시지를 분할하여 애플리케이션 성능 및 확장성을 최대화할 수 있다. 예를 들어, 덜 중요한 백그라운드 작업은 한가한 시간에 실행하도록 예약된 수신기에서 처리하는 대신, 중요한 작업은 즉시 실행되는 수신기에서 처리할 수 있도록 더 높은 우선 순위를 지정할 수 있다.

4. 문제 및 고려 사항

이 패턴을 구현할 방법을 결정할 때 다음 사항을 고려해야 한다.

솔루션의 컨텍스트에서 우선 순위를 정의한다. 예를 들어 높은 우선 순위는 메시지를 10초 이내에 처리해야 함을 의미할 수 있다. 우선 순위가 높은 항목 및 이러한 기준을 맞추기 위해 할당되어야 하는 다른 리소스를 처리하기 위한 요구 사항을 식별한다.

우선 순위가 높은 모든 항목을 우선 순위가 낮은 항목보다 먼저 처리해야 하는지 결정한다. 메시지가 단일 소비자 풀에서 처리되는 경우, 우선 순위가 높은 메시지를 사용할 수 있게 되면 우선 순위가 낮은 메시지를 처리하는 작업을 선점하여 일시 중단할 수 있는 메커니즘을 제공해야 한다.

여러 큐 방식에서 각 큐의 전용 소비자 풀이 아닌 모든 큐에서 수신 대기하는 단일 소비자 프로세스 풀을 사용하는 경우, 소비자는 항상 우선 순위가 높은 큐의 메시지를 우선 순위가 낮은 큐의 메시지보다 먼저 처리하는 알고리즘을 적용해야 한다.

우선 순위가 높고 낮은 큐의 처리 속도를 모니터링하여 이러한 큐의 메시지가 예상 속도로 처리되도록 한다.

우선 순위가 낮은 메시지가 처리되도록 하려면 여러 개의 소비자 풀을 사용하는 여러 메시지 큐 방식을 구현해야 합니다. 또는 메시지 우선 순위 지정을 지원하는 큐에서 대기 중인 메시지의 우선 순위를 동적으로 높일 수 있다. 그러나 이 방식은 이 기능을 제공하는 메시지 큐에 따라 달라진다.

각 메시지 우선 순위에 대해 별도의 큐를 사용하는 것이 잘 정의된 몇 가지 우선 순위가 있는 시스템에 가장 적합하다.

메시지 우선 순위는 시스템에서 논리적으로 결정될 수 있다. 예를 들어 명시적으로 높은 우선 순위 및 낮은 우선 순위 메시지를 갖는 대신 “유료 고객” 또는 “비 수수료 지불 고객”으로 지정할 수 있다. 비즈니스 모델에 따라 시스템은 비비용 지불 고객보다 유료 고객의 메시지를 처리하는데 더 많은 리소스를 할당할 수 있다.

큐에서 메시지를 확인하는 것과 관련된 금융 및 처리 비용이 있을 수 있다(일부 상용 메시지 시스템은 메시지를 게시하거나 검색할 때마다 그리고 메시지에 대해 큐를 쿼리할 때마다 약간의 요금을 부과한다). 여러 큐를 확인하는 경우 이 비용이 늘어난다.

풀에서 처리하는 큐의 길이에 따라 소비자 풀의 크기를 동적으로 조정할 수 있다.

5. 이 패턴을 사용해야 하는 경우

이 패턴은 다음과 같은 시나리오에서 유용하다.

  • 시스템에서 우선 순위가 다른 여러 작업을 처리해야 한다.

  • 다른 사용자 또는 테넌트에는 서로 다른 우선 순위로 서비스가 제공되어야 한다.

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.