Site icon 지락문화예술공작단

Amazon SNS, FIFO(선입선출) 게시/구독 메시징 기능 출시

Amazon SNS, FIFO(선입선출) 게시/구독 메시징 기능 출시

분산 소프트웨어 아키텍처를 설계할 때, 서비스에서 정보를 교환하는 방법을 정의하는 것이 중요합니다. 예를 들어, 비동기 통신을 사용하면 구성 요소를 분리하고 확장이 단순해지므로 변경의 영향을 줄이고 새로운 기능을 쉽게 출시할 수 있습니다.

비동기 서비스 간 통신의 가장 일반적인 두 가지 형태는 메시지 대기열게시/구독 메시징입니다.

여러 애플리케이션에 메시지를 팬아웃하려는 경우에는 주제를 사용하고, 애플리케이션에 메시지를 보내려는 경우에는 대기열을 사용할 수 있습니다. 주제와 대기열을 함께 사용하여 마이크로서비스, 분산 시스템서버리스 애플리케이션을 분리할 수 있습니다.

SQS를 사용하면 FIFO(선입선출) 대기열을 사용하여 메시지를 전송하고 수신하는 순서를 유지하고 메시지가 두 번 이상 처리되지 않도록 할 수 있습니다.

SNS FIFO 주제 소개
오늘 AWS는 SNS FIFO 주제를 소개하면서 게시/구독 메시징을 위한 비슷한 기능을 추가하였습니다. 이를 통해 메시지 순서를 엄격히 준수하고 한 명 이상의 구독자에게 중복 제거된 메시지를 전달하는 기능을 제공할 수 있습니다.

FIFO 주제는 FIFO 대기열과 비슷한 순서 지정과 중복 제거 기능을 관리합니다.

순서 지정 – FIFO 주제에 메시지를 게시할 때 메시지 그룹 ID를 포함하여 메시지 그룹을 구성합니다. 각 메시지 그룹 ID에 대해 모든 메시지는 도착한 순서대로 전송되고 전달됩니다. 예를 들어, 동일한 고객과 관련된 메시지를 순서대로 전달하기 위해 고객의 계정 번호를 메시지 그룹 ID로 사용하여 이러한 메시지를 주제에 게시할 수 있습니다. FIFO 주제 및 대기열에서 메시지 그룹 수에는 제한이 없습니다. 메시지 그룹 ID는 미리 선언하지 않아도 되며, 어떤 값이라도 적합합니다. 메시지를 논리적으로 구분하지 않는 경우에는 모든 메시지에 대해 동일한 메시지 그룹 ID를 사용하고 순서 지정된 메시지의 단일 그룹을 보유하면 됩니다. 메시지 그룹 ID는 구독된 FIFO 대기열에 전달됩니다.

중복 제거 – 분산 시스템 (예: SNS) 및 클라이언트 애플리케이션은 때때로 중복 메시지를 생성하기도 합니다. 주제에서 중복된 메시지 전달을 방지하기 위해 주제에서 콘텐츠 기반 중복 제거를 지원하거나 게시하는 메시지에 중복 제거 ID를 추가하는 두 가지 방법을 사용할 수 있습니다. 메시지 콘텐츠 기반 중복 제거에서는 SNS가 SHA-256 해시를 사용하여 메시지 본문을 통해 메시지 중복 제거 ID를 생성합니다. 특정 중복 제거 ID의 메시지가 게시된 후에는 5분 동안 동일한 중복 제거 ID의 메시지가 허용되지만 전달되지 않습니다. FIFO 주제에 FIFO 대기열을 구독하면 중복 제거 ID가 대기열에 전달되고 SQS에서 중복 메시지가 수신되지 않도록 하는 데 사용됩니다.

FIFO 주제와 대기열을 함께 사용하여 작업 및 이벤트의 순서가 중요하거나 중복을 허용할 수 없는 애플리케이션의 구현을 단순화할 수 있습니다. 예를 들어, 재무 운영 및 인벤토리 업데이트를 처리하거나 클라이언트 장치에서 수신하는 명령을 비동기적으로 적용할 수 있습니다. FIFO 대기열은 FIFO 주제에서 메시지 필터링을 사용하여 주제에 게시된 모든 메시지가 아니라, 메시지의 하위 집합만 선택적으로 수신할 수 있습니다.

SNS FIFO 주제 사용 방법
FIFO 주제가 유용한 일반적인 시나리오는 순서대로 처리해야 하는 업데이트를 수신할 때입니다. 예를 들어, FIFO 주제를 사용하여 고객이 계정 프로필을 편집하는 애플리케이션에서 업데이트를 수신할 수 있습니다. 그런 다음, FIFO 주제에 SQS FIFO 대기열을 구독하고, 동기화 상태를 유지해야 하는 고객 관리 시스템에서 사용하는 Amazon DynamoDB 테이블에 계정 업데이트를 적용하는 Lambda 함수의 트리거로 이 대기열을 사용합니다.

FIFO 주제에 도입된 분리 기능을 사용하면 기존 애플리케이션에 미치는 영향을 최소화하면서 새로운 기능을 쉽게 추가할 수 있습니다. 예를 들어, 충성도가 높은 고객에게 추가 프로모션을 제공하기 위해 Amazon Aurora에서 관리하는 관계형 데이터베이스에 정보를 저장하는 새로운 충성도 애플리케이션을 추가합니다. 충성도 데이터베이스에 저장된 고객 정보를 다른 애플리케이션과 동기화 상태를 유지하기 위해 동일한 FIFO 주제에 새 FIFO 대기열을 구독하고, 생성된 순서대로 고객 업데이트를 수신하는 새로운 Lambda 함수를 추가한 후 충성도 데이터베이스에 적용할 수 있습니다. 이러한 방법을 사용하면 새로운 충성도 앱을 통합하기 위해 다른 애플리케이션을 구성하고 코드를 변경하지 않아도 됩니다.

먼저 SQS 콘솔에서 2개의 FIFO 대기열을 만들고 모든 옵션을 기본값으로 유지합니다.

SNS 콘솔에서 updates.fifo 주제를 생성합니다. 유형으로 FIFO를 선택하고 [콘텐츠 기반 메시지 중복 제거(Content-based message deduplication)]를 활성화합니다.

그런 다음, 주제에 customer.fifoloyalty.fifo 대기열을 구독합니다.

메시지를 수신할 수 있도록 대기열에 메시지를 전송할 권한을 updates.fifo 주제에 부여하는 명령문을 두 대기열의 액세스 정책에 추가합니다. 예를 들어, customer.fifo 대기열의 경우 명령문은 다음과 같습니다.

{
  "Effect": "Allow",
  "Principal": {
    "Service": "sns.amazonaws.com"
  },
  "Action": "SQS:SendMessage",
  "Resource": "arn:aws:sqs:us-east-2:123412341234:customer.fifo",
  "Condition": {
    "ArnLike": {
      "aws:SourceArn": "arn:aws:sns:us-east-2:123412341234:updates.fifo"
    }
  }
}

이제 SNS 콘솔을 사용하여 4개 메시지를 순서대로 게시합니다. 모든 메시지에 대해 동일한 메시지 그룹 ID를 사용합니다. 이 방법에서는 메시지가 모두 같은 메시지 그룹에 있습니다. 유일한 차이점은 다음 순서대로 사용하는 메시지 본문에 있습니다.

SQS 콘솔에서는 FIFO 대기열에 3개 메시지만 전달되는 것으로 나타납니다.

왜 그럴까요? FIFO 주제를 생성할 때 [콘텐츠 기반 중복 제거(content-based deduplication)]를 활성화했기 때문입니다. 4개 메시지는 5분의 중복 제거 기간에 전송되었습니다. 마지막 메시지는 첫 번째 메시지의 중복으로 인식되어, 구독된 대기열에 전달되지 않았습니다.

대기열에서 실제 메시지를 확인해보겠습니다. AWS CLI(명령줄 인터페이스)를 사용하여 SQS에서 메시지를 수신하고, jq 명령줄 JSON 프로세서를 사용하여 출력을 형식화하고 본문에서 메시지만 가져옵니다.

다음은 customer.fifo 대기열의 메시지입니다.

$ aws sqs receive-message --queue-url https://sqs.us-east-2.amazonaws.com/123412341234/customer.fifo --max-number-of-messages 10 | jq '.Messages[].Body | fromjson | .Message'

"Update One"
"Update Two"
"Update Three"

다음은 loyalty.fifo 대기열의 메시지입니다.

$ aws sqs receive-message --queue-url https://sqs.us-east-2.amazonaws.com/123412341234/loyalty.fifo --max-number-of-messages 10 | jq '.Messages[].Body | fromjson | .Message'

"Update One"
"Update Two"
"Update Three"

예상대로 고유한 콘텐츠의 3개 메시지가 전송된 순서대로 동일하게 두 대기열에 전달되었습니다.

정식 출시
모든 상용 리전에서 SNS FIFO 주제를 사용할 수 있습니다. FIFO 주제 또는 FIFO 대기열마다 최대 300개의 TPS(초당 트랜잭션 수)를 처리할 수 있습니다. SNS를 사용하면 사용한 만큼만 지불하면 됩니다. 자세한 내용은 요금 페이지에서 확인할 수 있습니다.

자세히 알아보려면 설명서를 참조하십시오.

Danilo

Source: Amazon SNS, FIFO(선입선출) 게시/구독 메시징 기능 출시

Exit mobile version