Fall in IT.

SQS FIFO Queue로 구성한 부품 매칭 시스템 구조와 설계 이유 본문

시스템구축

SQS FIFO Queue로 구성한 부품 매칭 시스템 구조와 설계 이유

D.Y 2025. 7. 4. 09:11
반응형

1. 배경: 자동 회로 설계 툴과 부품 매칭

우리는 자동 회로 설계 도구를 개발하면서, 회로에 배치할 다양한 부품들을 적절히 배치하기 위해 부품의 타입과 카테고리를 자동으로 매칭하는 작업이 필요했다. 사전에 정의된 매칭 데이터가 없는 경우에는 부품 분석 서버에 분석을 요청하고, 그 결과로부터 카테고리와 타입 정보를 전달받는 구조로 설계했다.

2. 처리 방식: 비동기 분석과 메시지 응답 구조

부품 분석 작업은 종류가 방대하고, 처리 시간도 예측하기 어려웠다. 따라서 동기 요청이 아닌 비동기 방식으로 분석 요청을 보내고, 분석 결과는 메시지 큐를 통해 응답받는 구조를 설계했다. 이렇게 함으로써 시스템은 다양한 부품 분석 요청을 병렬로 처리할 수 있고, 결과는 분산된 여러 인스턴스에서 수신 및 반영할 수 있게 되었다.

3. SQS FIFO Queue를 선택한 이유

하나의 회로(Project)에는 수많은 부품이 포함되고, 이 중 일부는 분석 서버를 통해 매칭이 필요하다. 특정 프로젝트에서 여러 부품에 대한 매칭 요청이 동시에 발생할 수 있으며, 이 요청에 대한 결과를 여러 인스턴스가 동시에 처리하게 되면 데이터베이스 반영 시 순서 꼬임이나 Race Condition이 발생할 수 있다.

이 문제를 해결하기 위해 SQS FIFO Queue를 선택했다. FIFO Queue는 메시지 순서를 보장하고, Message Group ID를 통해 특정 그룹의 메시지들이 순차적으로만 처리되도록 제어할 수 있다. 이를 통해 동일한 프로젝트 내 응답 메시지들은 정확한 순서대로 반영되며, 데이터 일관성을 유지할 수 있다.

4. FIFO Queue로 해결한 문제

FIFO Queue는 Standard Queue와 달리, 같은 메시지 그룹에 속한 메시지는 반드시 순서대로 처리된다는 특징이 있다.

예를 들어, 두 개의 인스턴스 A와 B가 SQS FIFO Queue를 폴링하고 있다고 가정했을 때, 동일한 Group ID를 가진 메시지 두 개가 큐에 들어있다면, 인스턴스 A가 첫 번째 메시지를 폴링하는 순간 두 번째 메시지는 locked 상태가 되어 다른 인스턴스(B)는 가져갈 수 없다. 인스턴스 A가 메시지를 처리한 후 DeleteMessage를 호출하면, 그제서야 다음 메시지가 visible 상태가 되어 다른 인스턴스가 가져갈 수 있다.

이러한 메커니즘은 분산 환경에서도 Group ID 단위로 메시지 처리를 직렬화하여 순서를 보장해준다.

5. 처리량을 높이기 위한 전략

FIFO 구조에서도 다음과 같은 방법으로 처리량을 높일 수 있다:

  • 워커 수를 늘려 더 많은 인스턴스가 메시지를 병렬로 폴링
  • MaxNumberOfMessages 값을 높여 한 번에 더 많은 메시지를 가져오기
  • 수신한 메시지를 내부 비동기 구조로 처리하여 처리 지연 최소화

단, 주의할 점은 하나의 리시버가 MaxNumberOfMessages=10으로 메시지를 수신하면, 같은 Message Group ID를 가진 여러 메시지를 한 번에 수신할 수 있다는 것이다. 이 경우 메시지의 순서는 SQS가 보장해주지만, 애플리케이션에서 이 순서를 지켜 처리해야 한다. 순서 보장이 반드시 필요한 경우, MaxNumberOfMessages=1로 설정하거나 메시지 수신 후 동기적으로 순차 처리해야 한다.

6. 결론

같은 Message Group ID를 가진 메시지는 동시에 여러 리시버가 처리할 수 없고, 오직 하나의 리시버만 처리할 수 있다. 하지만 하나의 리시버는 한 번에 같은 그룹의 여러 메시지를 받을 수 있으며, 이 경우에도 메시지의 순서는 보장된다. FIFO Queue의 이 특성을 활용하면, 분산 환경에서도 메시지 순서와 데이터 일관성을 안전하게 보장할 수 있다.


추가

https://github.com/leeduyoung/fifo-parallelizer

반응형
Comments