View a markdown version of this page

전자 상거래 애플리케이션용 Amazon ElastiCache(Valkey) - Amazon ElastiCache

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

전자 상거래 애플리케이션용 Amazon ElastiCache(Valkey)

전자 상거래 애플리케이션은 애플리케이션 서버와 데이터베이스 간의 인 메모리 캐시 계층의 이점을 누릴 수 있습니다. Valkey를 실행하는 Amazon ElastiCache는 제품 카탈로그 항목, 인벤토리 수, 검색 결과, 사용자 세션 등 자주 액세스하는 데이터에 대해 밀리초 미만의 읽기 지연 시간을 제공하여 데이터베이스 로드를 줄이고 트래픽이 급증하는 동안 응답 시간을 개선합니다.

클러스터 구성

데이터 볼륨, 처리량 요구 사항 및 운영 기본 설정에 따라 클러스터 유형을 선택합니다.

전자 상거래의 클러스터 유형 비교
클러스터 유형 최적의 용도 규모 조정 고려 사항

서버리스

가변 트래픽 패턴, 새 애플리케이션, 캐시 운영 전문 지식이 없는 팀

자동 - 필요에 따라 컴퓨팅 및 메모리를 확장합니다.

용량 계획은 필요하지 않습니다. 가변 비용 모델 - 소비한 만큼 비용을 지불합니다.

노드 기반(클러스터 모드 활성화됨)

예측 가능한 높은 처리량 워크로드, 샤딩 및 노드 유형에 대한 세분화된 제어 필요

샤드 및 복제본의 수동 또는 자동 크기 조정

용량 계획이 필요합니다. 고정 비용 모델 - 사용률에 관계없이 프로비저닝된 용량에 대한 비용을 지불합니다. 클러스터당 최대 500개의 노드를 지원합니다.

대부분의 전자 상거래 애플리케이션에서 Serverless는 프로덕션을 위한 가장 간단한 경로를 제공합니다. 예측 가능한 트래픽 기준이 있고 클러스터 토폴로지, 노드 유형 및 조정 동작을 더 잘 제어해야 하는 경우 노드 기반 클러스터로 마이그레이션합니다.

권장 클러스터 설정
설정 이론적 근거

Engine

안정적인 최신 버전

ElastiCache에서 사용할 수 있는 안정적인 최신 Valkey 릴리스를 사용합니다. Redis OSS 명령과 완벽하게 호환됩니다. 이전 버전보다 성능이 향상되었습니다.

다중 AZ

활성화됨

프라이머리 노드에 장애가 발생할 경우 다른 가용 영역의 복제본으로 자동 장애 조치. 프로덕션 전자 상거래 워크로드에 필요합니다.

전송 중 데이터 암호화

활성화됨(TLS)

애플리케이션과 캐시 클러스터 간의 데이터를 암호화합니다. 사용자 세션 또는 PII를 처리하는 워크로드에 필요합니다.

미사용 데이터 암호화

활성화됨

디스크의 데이터를 암호화합니다(백업, 스왑). 규정 준수 워크로드에 필요합니다.

서브넷 그룹

프라이빗 격리 서브넷(2+ AZs)

인터넷에 액세스할 수 없습니다. 애플리케이션의 보안 그룹에서만 연결할 수 있습니다.

제품 데이터의 주요 설계

데이터 유형 간 충돌을 방지하기 위해 예측 가능하고 디버깅 가능하며 범위가 지정되도록 캐시 키를 설계합니다.

키 이름 지정 규칙
데이터 유형 키 패턴 값 유형 예제

제품 세부 정보

product:{id}

해시

product:12345{이름, 가격, 설명, imageUrl}

인벤토리 수

inventory:{sku}

문자열(정수)

inventory:SKU-A100 → 42

사용자 세션

session:{sessionId}

해시

session:abc123{userId, cart, lastAccess}

검색 결과

search:{queryHash}

문자열(JSON)

search:sha256(q=shoes&page=1) → [제품 IDs]

범주 목록

category:{slug}:page:{n}

List

category:electronics:page:1 → [제품 IDs]

주요 설계 모범 사례:

  • 가독성 및 도구 지원을 위해 콜론을 구분자로 사용합니다.

  • 키를 짧게 유지 - 긴 키는 메모리와 네트워크 대역폭을 소비합니다.

  • 숫자 IDs를 공유할 수 있는 제품, 세션 및 기타 엔터티 간의 충돌을 방지하려면 데이터 유형 접두사를 포함합니다.

  • 다중 필드 객체(제품, 세션)에 해시를 사용하여 전체 값을 검색하지 않고도 부분 읽기 및 업데이트를 허용합니다.

데이터 유형별 TTL 전략

고객 경험에 영향을 주지 않고 데이터 변경 빈도와 기한 경과를 기준으로 TTL(time-to-live) 값을 설정합니다.

전자 상거래 데이터에 권장되는 TTLs
데이터 유형 TTL 무효화 트리거 이론적 근거

제품 세부 정보

5분

판매자가 제품 편집

제품 설명과 이미지는 자주 변경되지 않습니다. 모든 변경에 대해 명시적 무효화 없이 편집을 상당히 빠르게 선택할 수 있을 만큼 짧습니다.

인벤토리 수

30초

구매 또는 재고 보충

오래된 인벤토리로 인해 과다 판매가 발생할 수 있습니다. TTL이 매우 짧으면 카운트가 자주 새로 고쳐집니다. 즉각적인 정확성을 위해 구매 시 명시적 무효화.

검색 결과

60초

없음(TTL 기반만 해당)

검색 인덱스는 주기적으로 업데이트됩니다. 캐싱은 검색 엔진 부하를 줄입니다. 새 제품은 명시적 무효화 없이 60초 이내에 나타납니다.

사용자 세션

24시간

로그아웃 또는 세션 만료

세션은 브라우징 전반에 걸쳐 유지됩니다. 활성 세션을 유지하려면 각 액세스에서 TTL을 새로 고칩니다. 로그아웃 시를 명시적으로 삭제합니다.

범주 목록

2 minutes

범주에서 추가/제거된 제품

범주 페이지는 트래픽이 많습니다. 간단한 캐싱은 검색 중에 데이터베이스 쿼리를 크게 줄입니다.

캐시 어사이드 패턴

캐시 어사이드 패턴(지연 로딩이라고도 함)은 전자 상거래 애플리케이션의 가장 일반적인 캐싱 전략입니다. 애플리케이션은 먼저 캐시를 확인하고 캐시 누락 시에만 데이터베이스를 쿼리합니다.

읽기 경로(의사 코드)

FUNCTION getProduct(productId): cacheKey = "product:" + productId // Step 1: Check the cache cachedValue = cache.GET(cacheKey) IF cachedValue exists: RETURN deserialize(cachedValue) // Cache hit — sub-millisecond // Step 2: Cache miss — query database product = database.query("SELECT * FROM products WHERE id = ?", productId) IF product not found: RETURN null // Step 3: Write to cache with TTL cache.SET(cacheKey, serialize(product), EXPIRE = 300) // 5 minutes RETURN product
쓰기 경로(의사 코드)

FUNCTION updateProduct(productId, updatedFields): // Step 1: Update the database (source of truth) database.update("UPDATE products SET ... WHERE id = ?", updatedFields, productId) // Step 2: Invalidate the cache (don't update it) cache.DELETE("product:" + productId) // Next read will trigger a cache miss and repopulate from database
중요

쓰기 시 캐시를 업데이트하는 대신 항상 무효화(삭제)합니다. 이렇게 하면 오래된 읽기가 새 값을 덮어쓰는 레이스 조건의 기간이 줄어듭니다. 다음 읽기는 데이터베이스에서 캐시를 다시 채웁니다.이 데이터베이스는 정확한 소스입니다. 좁은 경쟁 조건은 여전히 존재합니다. 동시 읽기가 쓰기 전에 데이터베이스에서 데이터를 가져오는 경우 캐시 키가 이미 삭제된 후 오래된 데이터로 캐시를 다시 채울 수 있습니다. 대부분의 전자 상거래 워크로드의 경우 짧은 TTL이 이를 허용합니다. 엄격한 일관성이 필요한 경우 분산 잠금 또는 버전 지정된 쓰기를 사용합니다.

캐시 실패 처리

FUNCTION getProductWithFallback(productId): TRY: RETURN getProduct(productId) // Normal cache-aside path CATCH cacheConnectionError: // Cache is unavailable — fall back to database directly RETURN database.query("SELECT * FROM products WHERE id = ?", productId) // Log the error, trigger an alarm, but don't fail the request

캐시 실패로 인해 성능이 저하되지만(응답 속도가 느림) 기능을 손상시키지 않도록 애플리케이션을 설계합니다. 데이터베이스는 대체 역할을 합니다.

캐시 무효화 전략

무효화를 통해 사용자는 업데이트 후 현재 데이터를 볼 수 있습니다. 변경 사항을 얼마나 빨리 표시해야 하는지에 따라 전략을 선택합니다.

무효화 접근 방식
접근 방식 작동 방식 사용해야 하는 경우

쓰기 시 삭제

애플리케이션은 데이터베이스를 업데이트한 직후 캐시 키를 삭제합니다.

대부분의 쓰기(제품 편집, 인벤토리 변경). 간단하고 안정적이며 오래된 데이터를 방지합니다.

TTL 만료만

무효화 금지 - TTL이 자연스럽게 만료되도록 합니다.

짧은 기한 경과가 허용되는 데이터(검색 결과, 범주 목록, 분석).

이벤트 기반 무효화

백그라운드 프로세스는 데이터베이스 변경 이벤트를 수신 대기하고 영향을 받는 키를 무효화합니다.

쓰기 경로와 캐시가 서로 다른 서비스에 있거나 단일 데이터베이스 변경이 많은 캐시 키에 영향을 미치는 시스템입니다.

Amazon CloudFront를 CDN 계층으로 사용하는 마켓플레이스 애플리케이션의 경우 두 계층에서 무효화를 조정합니다. 즉, ElastiCache 키를 삭제하고 CloudFront 캐시 무효화(또는 캐시 태그 무효화)를 전송하여 사용자가 애플리케이션과 엣지 계층 모두에서 업데이트된 콘텐츠를 볼 수 있도록 합니다.

연결 관리

  • 연결 풀링 사용 - 각 캐시 작업에 대해 새 TLS 연결을 생성하면 지연 시간이 추가됩니다. 영구 연결 풀을 유지 관리하고 요청 간에 재사용합니다.

  • 연결 제한 시간 설정 - 짧은 연결 제한 시간(1~2초)과 짧은 명령 제한 시간(100~500ms)을 사용합니다. 캐시가 빠르게 응답하지 않는 경우 요청을 차단하지 않고 데이터베이스로 돌아갑니다.

  • 장애 조치 정상 처리 - 다중 AZ 장애 조치가 발생하면 이전 기본 중단에 대한 연결입니다. 연결 풀은 손상된 연결을 감지하고 자동으로 다시 연결해야 합니다. 대부분의 클라이언트 라이브러리는 이를 처리하지만 테스트 중인 동작을 확인합니다.

  • 클러스터의 구성 엔드포인트 사용 - 클러스터 모드가 활성화된 경우 개별 노드 엔드포인트가 아닌 구성 엔드포인트에 연결합니다. 구성 엔드포인트는 요청을 올바른 샤드로 자동으로 라우팅합니다.

모니터링할 주요 지표

전자 상거래 캐시에 권장되는 Amazon CloudWatch 경보
지표 Threshold Period 작업

CacheHitRate

< 80%

5분

조사 - 적중률이 낮으면 TTLs이 너무 짧거나 키가 잘못 설계되었거나 작업 세트가 메모리를 초과할 수 있습니다.

EngineCPUUtilization

> 70%

5분

스케일 업(더 큰 노드) 또는 스케일 아웃(더 많은 샤드) CPU가 높으면 캐시가 효율적으로 처리할 수 있는 것보다 더 많은 명령을 처리하고 있음을 나타냅니다.

DatabaseMemoryUsagePercentage

> 80%

5분

제거 위험. 메모리를 늘리거나(스케일 업) 저장된 데이터를 줄입니다(TTLs 단축, 캐시된 데이터 유형 감소).

Evictions

> 0 지속

1분

캐시가 가득 차서 데이터를 제거하여 공간을 확보합니다. 캐시 누락을 늘립니다. 덜 중요한 데이터에서 메모리를 확장하거나 TTLs 줄입니다.

CurrConnections

클라이언트 풀 크기의 > 80%

5분

연결 풀이 거의 소진되었습니다. 풀 크기를 늘리거나, 연결 대기 시간을 줄이거나, 애플리케이션 코드에서 연결 누수를 조사합니다. 임곗값은 서버 최대값(65,000)이 아닌 애플리케이션의 구성된 풀 크기를 기준으로 합니다.

자주 묻는 질문(FAQ)

서버리스와 노드 기반은 언제 사용해야 하나요?

트래픽이 예측할 수 없는 경우(새로운 마켓플레이스, 계절별 급증), 용량 계획을 피하려는 경우 또는 팀에 캐싱 운영 전문 지식이 없는 경우 Serverless를 사용합니다. 트래픽 패턴이 안정적이거나, 샤딩을 세밀하게 제어해야 하거나, 지속적인 처리량으로 인해 노드 기반이 비용 효율적일 때 노드 기반 로 전환합니다.

Valkey 또는 Redis OSS를 사용해야 합니까?

새 배포에는 Valkey를 사용합니다. Valkey는 새로운 ElastiCache 클러스터의 기본 엔진으로, Redis OSS 명령 및 데이터 구조와 완벽하게 호환되며 지속적인 개발을 받습니다. 기존 Redis OSS 클러스터는 계속 작동합니다. 인플레이스 엔진 업그레이드를 사용하여 편리한 경우 Valkey로 마이그레이션하세요.

캐시를 사용할 수 없는 경우 어떻게 되나요?

애플리케이션은 캐시를 종속성이 아닌 최적화로 취급해야 합니다. 캐시를 사용할 수 없는 경우 데이터베이스 직접 쿼리로 돌아갑니다. 응답 시간은 더 길지만 애플리케이션은 계속 작동합니다. 다중 AZ를 활성화하면 전체 캐시를 사용할 수 없는 경우는 드뭅니다. 복제본으로의 장애 조치는 일반적으로 30초 이내에 완료됩니다.

필요한 메모리를 어떻게 추정하나요?

계산: (캐싱할 고유 항목 수) × (항목당 평균 크기) × (Valkey 데이터 구조의 오버헤드 계수 1.2). 오버헤드는 객체 크기와 데이터 유형에 따라 다릅니다. 작은 객체는 비례적으로 오버헤드가 높습니다. 예를 들어, 각각 1.2x 오버헤드 = 약 240MB인 2KB의 제품 100,000개. 세션 데이터, 검색 결과 및 인벤토리 수를 추가합니다. 헤드룸(사용 가능한 메모리의 60%를 대상으로 사용)으로 시작하고 DatabaseMemoryUsagePercentage 지표를 모니터링하여 조정합니다.