우선 순위 큐 패턴을 사용하면 워크로드가 우선 순위가 낮은 작업보다 우선 순위가 높은 작업을 더 빨리 처리할 수 있습니다. 이 패턴은 하나 이상의 큐로 전송된 메시지를 사용하며 개별 클라이언트에 서로 다른 서비스 수준 보장을 제공하는 애플리케이션에서 유용합니다.
컨텍스트 및 문제점
워크로드는 중요도 및 긴급도의 다양한 수준으로 작업을 관리하고 처리해야 하는 경우가 많습니다. 일부 작업에는 즉각적인 주의가 필요하지만 다른 작업은 기다릴 수 있습니다. 우선 순위가 높은 작업을 해결하지 못하면 사용자 환경에 영향을 미치고 SLA(서비스 수준 계약)를 위반할 수 있습니다.
우선 순위에 따라 작업을 효율적으로 처리하려면 워크로드에 따라 작업의 우선 순위를 지정하고 실행하는 메커니즘이 필요합니다. 일반적으로 워크로드는 FIFO(선착순) 큐 구조를 사용하여 도착하는 순서대로 작업을 처리합니다. 이 방법은 작업의 다양한 중요성을 고려하지 않습니다.
솔루션
우선 순위 큐를 사용하면 워크로드가 도착 순서가 아닌 우선 순위에 따라 작업을 처리할 수 있습니다. 큐에 메시지를 보내는 애플리케이션은 메시지에 우선 순위를 할당하고 소비자는 우선 순위에 따라 메시지를 처리합니다. 다음 요구 사항이 있는 경우 우선 순위 큐 패턴을 사용합니다.
다양한 긴급도 및 중요도의 작업을 처리합니다. 긴급도 및 중요도가 다른 태스크가 있으며 덜 중요한 작업보다 더 중요한 작업을 처리해야 합니다.
다른 서비스 수준 계약을 처리합니다. 높은 우선 순위의 클라이언트가 더 나은 성능과 가용성을 받을 수 있도록 클라이언트에 필요한 다양한 서비스 수준 보장을 제공합니다.
다양한 워크로드 관리 요구 사항을 수용합니다. 특정 작업을 즉시 처리해야 하는 워크로드가 있으며 덜 긴급한 작업은 기다릴 수 있습니다.
우선 순위 큐 패턴을 구현하는 두 가지 주요 방법이 있습니다.
단일 큐: 모든 메시지가 하나의 큐로 전송되고 각 메시지에 우선 순위가 할당됩니다.
여러 큐: 각 메시지 우선 순위에 대해 별도의 큐가 사용됩니다.
단일 큐
애플리케이션(생산자)은 단일 큐를 사용하여 각 메시지에 우선 순위를 할당하고 메시지를 큐에 보냅니다. 큐는 우선 순위별로 메시지를 정렬하여 소비자가 우선 순위가 낮은 메시지보다 우선 순위가 높은 메시지를 처리하도록 합니다.
그림 1 단일 큐 및 단일 소비자 풀의 아키텍처
여러 큐
여러 큐를 사용하면 메시지를 우선 순위별로 구분할 수 있습니다. 애플리케이션은 각 메시지에 우선 순위를 할당하고 해당 우선 순위에 해당하는 큐로 메시지를 전달합니다. 소비자는 메시지를 처리합니다. 다중 큐 솔루션은 단일 소비자 풀 또는 여러 소비자 풀을 사용합니다.
여러 소비자 풀
여러 소비자 풀을 사용하는 각 큐에는 전용 소비자 리소스가 있습니다. 우선 순위가 높은 큐는 낮은 우선 순위 큐보다 더 빠르게 메시지를 처리하기 위해 더 많은 소비자 또는 더 높은 성능 계층을 사용해야 합니다.
다음과 같은 경우 여러 소비자 풀을 사용합니다.
- 엄격한 성능 요구 사항: 서로 다른 작업 우선 순위에 독립적으로 충족해야 하는 엄격한 성능 요구 사항이 있는 경우 여러 소비자 풀이 필요합니다.
- 높은 안정성 요구 사항: 안정성 및 오류 격리가 중요한 애플리케이션에는 여러 소비자 풀이 필요합니다. 한 큐의 문제는 다른 큐에 영향을 미치지 않아야 합니다.
- 복잡한 애플리케이션: 다양한 처리 특성과 다양한 태스크에 대한 성능 보장이 필요한 태스크가 있는 복잡한 애플리케이션에 유용합니다.
그림 2. 여러 큐 및 여러 소비자 풀의 아키텍처입니다.
단일 소비자 풀
단일 소비자 풀을 사용하면 모든 큐가 단일 소비자 풀을 공유합니다. 소비자는 우선 순위가 높은 큐에서 메시지를 먼저 처리하고 우선 순위가 높은 메시지가 없는 경우 우선 순위가 낮은 큐에서만 메시지를 처리합니다. 따라서 단일 소비자 풀은 우선 순위가 낮은 메시지보다 우선 순위가 높은 메시지를 항상 처리합니다. 이 설정으로 인해 우선 순위가 낮은 메시지가 지속적으로 지연되고 잠재적으로 처리되지 않을 수 있습니다.
다음을 위해 단일 소비자 풀을 사용합니다.
- 간단한 관리: 단일 소비자 풀은 설정 및 유지 관리의 용이성을 최우선으로 하는 애플리케이션에 적합합니다. 구성 및 모니터링의 복잡성을 줄입니다.
- 통합 처리 요구 사항: 들어오는 작업의 정확한 특성이 비슷한 경우 단일 소비자 풀이 유용합니다.
그림 3. 여러 큐 및 단일 소비자 풀의 아키텍처입니다.
우선 순위 큐 패턴에 대한 권장 사항
우선 순위 큐 패턴을 구현하는 방법을 결정할 때 다음 권장 사항을 고려합니다.
일반 권장 사항
우선 순위를 명확하게 정의합니다. 솔루션과 관련된 고유하고 명확한 우선 순위 수준을 설정합니다. 예를 들어 우선 순위가 높은 메시지는 10초 이내에 처리해야 할 수 있습니다. 우선 순위가 높은 항목을 처리하기 위한 요구 사항을 파악하고 그에 따라 필요한 리소스를 할당합니다.
소비자 풀을 동적으로 조정합니다. 서비스 중인 큐 길이에 따라 소비자 풀의 크기를 조정합니다.
서비스 수준의 우선 순위를 지정합니다. 우선 순위가 지정된 가용성 또는 성능이 필요한 비즈니스 요구 사항을 충족하도록 우선 순위 큐를 구현합니다. 예를 들어 우선 순위가 높은 고객이 더 나은 성능과 가용성을 경험할 수 있도록 다양한 고객 그룹이 다양한 수준의 서비스를 받을 수 있습니다.
우선 순위가 낮은 처리를 보장합니다. 메시지 우선 순위를 지원하는 큐에서 시스템에서 우선 순위가 낮은 메시지가 결국 처리되도록 허용하는 경우 오래된 메시지의 우선 순위를 동적으로 늘입니다.
큐 비용을 고려합니다. 큐 확인과 관련된 재무 및 처리 비용에 유의하세요. 일부 큐 서비스는 메시지를 게시, 검색 및 쿼리하는 데 비용이 부과되며 큐 수에 따라 증가할 수 있습니다.
여러 큐 권장 사항
처리 속도를 모니터링합니다. 메시지가 예상 속도로 처리되도록 하려면 우선 순위가 높은 큐 및 낮은 우선 순위 큐의 처리 속도를 지속적으로 모니터링합니다.
비용을 최소화합니다. 사용 가능한 소비자와 함께 중요한 작업을 즉시 처리합니다. 덜 바쁜 시간 동안 덜 중요한 백그라운드 작업을 예약합니다.
단일 소비자 풀 권장 사항
선점 및 일시 중단을 구현합니다. 우선 순위가 높은 모든 항목을 우선 순위가 낮은 항목보다 먼저 처리해야 하는지 여부를 결정합니다. 여러 큐에 대해 단일 소비자 풀을 사용할 때 우선 순위가 높은 큐가 항상 우선 순위가 낮은 큐보다 우선 순위가 낮은 큐보다 우선 순위가 높은 큐가 서비스되도록 하는 알고리즘을 사용합니다.
비용을 최적화합니다. 단일 큐 접근 방식을 사용할 때 소비자 수를 축소하여 운영 비용을 최적화합니다. 우선 순위가 높은 메시지는 먼저 처리되지만 더 느리게 처리되지만 우선 순위가 낮은 메시지는 더 긴 지연에 직면할 수 있습니다.
워크로드 디자인
설계자는 우선 순위 큐 패턴이 Azure Well-Architected Framework 핵심 요소에서 다루는 목표와 원칙을 어떻게 해결할 수 있는지 평가해야 합니다. 예시:
핵심 요소 | 이 패턴이 핵심 목표를 지원하는 방법 |
---|---|
안정성 디자인 결정은 워크로드가 오작동에 대한 복원력을 갖도록 하고 오류가 발생한 후 완전히 작동하는 상태로 복구 되도록 하는 데 도움이 됩니다. | 비즈니스 우선 순위에 따라 항목을 분리하면 가장 중요한 작업에 안정성 노력을 집중할 수 있습니다. - RE:02 중요 흐름 - RE:07 백그라운드 작업 |
성능 효율성은 크기 조정, 데이터, 코드의 최적화를 통해 워크로드가 수요를 효율적으로 충족하는 데 도움이 됩니다. | 비즈니스 우선 순위에 따라 항목을 분리하면 가장 시간이 중요한 작업에 성능 노력을 집중할 수 있습니다. - PE:09 중요 흐름 |
디자인 결정과 마찬가지로 이 패턴으로 도입될 수 있는 다른 핵심 요소의 목표에 대한 절충을 고려합니다.
우선 순위 큐 패턴의 예
GitHub의 다음 예제에서는 Azure Service Bus를 사용하여 우선 순위 큐 패턴을 구현하는 방법을 보여 줍니다.
그림 4. GitHub의 PriorityQueue 예제 아키텍처
아키텍처의 개요는 다음과 같습니다.
애플리케이션(생산자): 이 예제에는 메시지를 만들고 각 메시지에서 호출
Priority
된 사용자 지정 속성을 할당하는 애플리케이션(PriorityQueueSender
)이 있습니다.Priority
의 값High
이 있습니다.Low
메시지 브로커 및 큐: 이 예제에서는 Azure Service Bus를 메시지 브로커로 사용합니다. 각 메시지 우선 순위(
High
및Low
)에 대해 하나씩 두 개의 Azure Service Bus 큐를 사용합니다. 애플리케이션(생산자)은 메시지를 기반으로 올바른 큐로 메시지를Priority
보냅니다.여러 소비자 풀: 이 예제에서는 각 큐에서 메시지를 읽는 데 전용으로 여러 소비자 풀(
PriorityQueueConsumerHigh
및PriorityQueueConsumerLow
)을 사용합니다.
예제 아키텍처의 역할 | 예제의 Azure 서비스 | 예제의 이름 |
---|---|---|
애플리케이션 | Azure Functions 앱 | PriorityQueueSender |
메시지 큐 브로커 | Azure Service Bus | <Service Bus 네임스페이스> |
메시지 큐 | Azure Service Bus 큐 | <큐 이름> |
사용자 | Azure Functions 앱 | PriorityQueueConsumerHigh PriorityQueueConsumerLow |
관련 참고 자료
다음 패턴은 이 패턴을 구현할 때 유용할 수 있습니다.