Azure Cosmos DB 변경 피드를 사용하면 쓰기 볼륨이 많은 대규모 데이터 세트를 효율적으로 처리할 수 있습니다. 전체 데이터 세트를 쿼리하여 변경 사항을 식별하는 대신 이 방법을 사용할 수 있습니다. 이 문서에서는 확장 가능한 솔루션을 구축하는 데 유용한 일반적인 변경 피드 설계 패턴과 함께 장단점 및 제한 사항을 설명합니다.
시나리오
Azure Cosmos DB는 IoT, 게임, 소매, 운영 로깅 애플리케이션 등에 적합합니다. 이러한 애플리케이션의 일반적인 디자인 패턴은 데이터 변경 사항을 통해 다른 작업을 실행하는 것입니다. 다음과 같은 작업이 포함됩니다.
- 항목이 삽입, 업데이트, 또는 삭제되는 경우 알림 또는 API에 대한 호출 트리거
- IoT에 대한 실시간 스트림 처리 또는 운영 데이터에 대한 분석
- 데이터 이동(예: 캐시, 검색 엔진, 데이터 웨어하우스 또는 콜드 스토리지와 동기화)
Azure Cosmos DB의 변경 피드를 활용하면, 다음 이미지와 같이 효율적이고 확장 가능한 솔루션을 구성하는 것이 가능합니다.
이벤트 컴퓨팅 및 알림
Azure Cosmos DB 변경 피드는 특정 이벤트 발생 시 알림을 트리거하거나 API를 호출하는 등의 시나리오를 간소화합니다. 변경 피드 프로세서 를 통해 컨테이너의 변경 사항을 자동으로 폴링하고, 쓰기, 업데이트, 삭제 각 작업에 대해 외부 API를 호출합니다.
특정 조건에 따라 알림을 선택적으로 실행하거나 API를 호출합니다. 예를 들어 Azure Functions를 사용하여 변경 피드에서 읽는 경우, 특정 조건이 충족될 때만 알림을 보내도록 함수에 로직을 추가합니다. Azure 함수 코드는 각 변경에 대해 실행되지만 조건이 충족되는 경우에만 알림이 전송됩니다.
실시간 스트림 처리
Azure Cosmos DB 변경 피드를 사용하면 IoT 데이터를 실시간으로 스트림 처리하거나 운영 데이터를 실시간으로 분석할 수 있습니다. 예를 들어, 디바이스, 센서, 인프라, 애플리케이션으로부터 이벤트 데이터를 받아 저장하고, Spark를 이용하여 이 이벤트를 실시간으로 처리합니다. 다음 그림은 변경 피드를 이용하여 Azure Cosmos DB로 람다 아키텍처를 구현하는 방법을 나타냅니다.
스트림 처리 구현에서 먼저 많은 양의 들어오는 데이터를 Azure Event Hubs 또는 Apache Kafka와 같은 임시 메시지 큐로 받는 경우가 많습니다. 변경 피드는 Azure Cosmos DB의 기능으로 인해 짧은 읽기 및 쓰기 대기 시간을 보장하여 지속적인 높은 비율의 데이터 수집을 지원하는 좋은 대안입니다.
데이터 지속성
Azure Cosmos DB에 기록된 데이터는 변경 피드에 표시됩니다. 최신 버전 모드에서 데이터는 삭제될 때까지 변경 피드에 남아 있습니다. 일반적으로 메시지 큐는 최대 보존 기간을 갖습니다. 예를 들어 Azure Event Hubs는 최대 90일간 데이터를 보존합니다.
쿼리 기능
Azure Cosmos DB 컨테이너의 변경 피드에서 데이터를 읽는 것과 더불어, Azure Cosmos DB에 저장된 데이터에 대한 SQL 쿼리도 실행할 수 있습니다. 변경 피드는 컨테이너에 이미 있는 데이터를 중복해서 읽지 않고, 데이터를 읽는 또 다른 메커니즘입니다. 결과적으로 변경 피드에서 데이터를 읽는 경우, 해당 데이터는 항상 동일한 Azure Cosmos DB 컨테이너에 대한 쿼리 결과와 일관성을 유지합니다.
고가용성
Azure Cosmos DB는 읽기 및 쓰기 가용성을 최대 99.999%까지 제공합니다. 대부분의 메시지 큐와 달리 Azure Cosmos DB 데이터는 복구 시간 목표(RTO)를 0으로 설정하여 전역적으로 분산 및 구성할 수 있습니다.
변경 피드에서 항목을 처리한 다음 구체화된 뷰를 빌드하고 집계된 값을 Azure Cosmos DB에 다시 저장합니다. 예를 들어, Azure Cosmos DB의 변경 피드를 활용하여 완료된 게임의 점수를 토대로 실시간 순위표를 구현하는 것이 가능합니다.
데이터 이동
실시간 데이터 이동을 위해 변경 피드에서 데이터를 읽어옵니다.
예를 들어 변경 피드를 사용하면 다음과 같은 작업을 효율적으로 수행할 수 있습니다.
Azure Cosmos DB에 저장된 데이터를 사용하여 캐시, 검색 인덱스 또는 데이터 웨어하우스를 업데이트합니다.
논리 파티션 키가 다른 경우, 다른 Azure Cosmos DB 계정 또는 컨테이너로 제로 다운타임 마이그레이션을 수행합니다.
애플리케이션 수준에서 데이터 계층화 및 보관을 구현합니다. 예를 들어, Azure Cosmos DB에 ‘핫 데이터’를 저장한 다음, 만료된 ‘콜드 데이터’를 Azure Blob Storage와 같은 다른 스토리지 시스템으로 내보낼 수 있습니다.
파티션 및 컨테이너 간에 데이터를 비정규화해야 하는 경우 이 데이터 복제의 원본으로 컨테이너의 변경 피드를 읽을 수 있습니다. 변경 피드를 사용하여 실시간으로 데이터를 복제하면 최종적 일관성만 보장됩니다. Azure Cosmos DB 컨테이너의 변경 사항을 처리할 때 변경 피드 프로세서가 얼마나 지연되고 있는지 모니터링할 수 있습니다.
이벤트 소싱
이벤트 소싱 패턴은 추가 전용 저장소를 통해 데이터의 모든 작업 과정을 기록합니다. Azure Cosmos DB 변경 피드는 모든 데이터 수집을 쓰기 작업(업데이트 또는 삭제는 제외)으로 모델링하는 이벤트 소싱 아키텍처의 핵심 데이터 저장소로 사용하기에 적합합니다. 이 경우 Azure Cosmos DB에 대한 각 쓰기는 하나의 ‘이벤트’로 취급되므로, 변경 피드에는 과거 이벤트에 대한 전체 기록이 보관됩니다. 중앙 이벤트 저장소에서 발행하는 이벤트는 주로 구체화 뷰를 유지하거나 외부 시스템과의 통합에 쓰입니다. 변경 피드 최신 버전 모드에서는 보존 기간에 제한이 없으므로 Azure Cosmos DB 컨테이너의 변경 피드 시작 부분부터 읽어서 모든 과거 이벤트를 재생할 수 있습니다. 여러 개의 변경 피드 소비자가 동일한 컨테이너에 있는 변경 피드를 구독하도록 허용할 수도 있습니다.
Azure Cosmos DB는 수평 확장성과 고가용성이라는 강점 덕분에 이벤트 소싱 패턴에서 뛰어난 중앙 집중식 추가 전용 영구 데이터 저장소 역할을 합니다. 또한 변경 피드 프로세서는 이벤트 처리가 누락되지 않도록 ‘최소 한 번’ 실행됨을 보장합니다.
현재 제한 사항
변경 피드는 다양한 모드로 제공되며, 각 모드별로 이해해야 할 중요한 제한 사항이 있습니다. 최신 버전 모드, 또는 모든 버전 모드, 삭제 모드에서 변경 피드를 사용하는 애플리케이션을 설계할 때 고려해야 할 몇 가지 영역이 있습니다.
중간 업데이트
최신 버전 모드에서는 특정 항목에 대한 최신 변경 사항만 변경 피드에 나타납니다. 변경 내용을 처리할 때는, 사용 가능한 최신 버전의 항목을 참고하시기 바랍니다. 짧은 시간 안에 동일한 항목에 대한 업데이트가 여러 번 발생하면 중간 업데이트 처리가 누락될 수 있습니다. 항목에 대한 개별 업데이트를 적용하려면 이러한 업데이트를 일련의 쓰기 작업으로 모델링하거나, 모든 버전 및 삭제 모드를 활용해야 합니다.
삭제
변경 피드 최신 버전 모드에서는 삭제된 항목을 캡처하지 않습니다. 컨테이너에서 항목을 삭제하면 변경 피드에서도 해당 항목이 제거됩니다. 삭제 작업을 처리하는 일반적인 방법은 삭제할 항목에 소프트 마커를 추가하는 것입니다.
deleted이라는 속성을 추가하고 삭제 시 true로 설정할 수 있습니다. 이 문서는 업데이트되면 변경 피드에 표시됩니다. 이 항목에 Time to Live (TTL)을 설정하여 나중에 자동으로 삭제되도록 할 수 있습니다.
보존
최신 버전 모드의 변경 사항 피드에는 보존 기간 제한이 없습니다. 항목은 컨테이너에 있는 동안 변경 피드에서 사용할 수 있습니다.
보장된 순서
모든 변경 피드 모드에서 순서는 파티션 키 값 내부에서는 보장되나, 파티션 키 값 전체에서는 보장되지 않습니다. 파티션 키는 의미 있는 순서가 보장되도록 선택해야 합니다.
이벤트 소싱 디자인 패턴을 적용한 소매 애플리케이션을 생각해 볼 수 있습니다. 이 애플리케이션에서 각 “이벤트”는 Azure Cosmos DB에 쓰이는 사용자 동작으로 모델링됩니다. 몇 가지 이벤트가 다음 순서대로 발생했다고 가정해 봅시다.
- 고객이 A 상품을 장바구니에 담았습니다.
- 고객이 B 상품을 장바구니에 담았습니다.
- 고객이 장바구니에서 A 상품을 삭제합니다.
- 고객이 체크 아웃을 완료하면 쇼핑 카트에 담긴 상품들이 배송됩니다.
현재 쇼핑 카트 콘텐츠의 구체화된 뷰는 각 고객에 대해 유지 관리됩니다. 이 애플리케이션은 이러한 이벤트를 발생한 순서대로 처리해야 합니다. 예를 들어 고객이 항목 A를 제거하기 전에 카트 체크 아웃이 처리되면, 고객이 원했던 항목 B 대신 항목 A가 배송될 수 있습니다. 이러한 4개의 이벤트가 순서대로 처리되려면 동일한 파티션 키 값을 가져야 합니다. 각 고객이 고유하게 갖는 사용자 이름을 파티션 키로 username 선택하면, 이러한 이벤트들이 Azure Cosmos DB에 기록된 순서대로 변경 피드에 나타나도록 보장할 수 있습니다.
예시
다음은 제공된 샘플 범위를 넘어서는 최신 버전 모드의 실제 변경 피드 코드 예제입니다.
- 변경 피드 소개에서 자세히 알아보세요.
- 변경 피드를 중심으로 하는 IoT 사용 사례에 대해 자세히 알아봅니다.
- 변경 피드를 중심으로 하는 소매 사용 사례에 대해 자세히 알아봅니다.