- 2021년 4월에 게시된 블로그 게시물의 연속입니다.
우리는 일반적인 웹 사용 사례와 서버리스 기능을 사용하여 주요 서버리스 데이터베이스의 성능을 비교하는 샘플 애플리케이션을 구축했습니다. 데이터베이스는 DynamoDB, MongoDB(Atlas), Firestore, Cassandra(Datastax Astra), FaunaDB 및 Redis(Upstash)입니다.
애플리케이션과 소스코드를 확인하세요.
우리가 비교한 것은 각 데이터베이스에 대한 상위 10개 뉴스 기사를 가져오는 대기 시간입니다. 전체 데이터는 New York Times API에서 수집한 7001개의 실제 뉴스 기사입니다. 지연 시간을 측정하는 쿼리:
select * from news where section = “World” order by view_count desc limit 10
백엔드는 AWS Lambda(Firestore용 Google Cloud 기능)에서 서버리스 기능으로 구현됩니다. 지연 시간을 최소화하기 위해 서버리스 기능과 데이터베이스를 동일한 지역(가능한 경우)에 배치했습니다.
대기 시간 측정에서 데이터베이스 연결 시간을 제외하고 쿼리 직전과 직후의 타임스탬프를 기록했습니다. 대기 시간은 백엔드(서버리스 기능 내부)에서 측정 및 기록되므로 브라우저와 서버 간의 네트워크 대기 시간은 포함되지 않습니다. 또한 대기 시간은 서버리스 기능의 콜드 스타트 시간에도 영향을 받지 않습니다.
동적 실제 데이터를 시뮬레이션하기 위해 상위 10개 기사에 임의의 view_count 값을 할당했습니다. 따라서 데이터베이스가 캐시를 사용하지 못하도록 강제로 다른 기사 세트를 반환하도록 할 때마다. 업데이트 작업은 대기 시간 계산에 포함되지 않습니다.
오늘(8월 25일) 대기 시간 수치입니다.
아래에 각 데이터베이스에 적용된 사용자 지정 구성을 나열합니다.
DynamoDB
지역:US-West-1
읽기 및 쓰기 용량:50(기본값은 5).
인덱스:파티션 키 섹션(문자열) 및 정렬 키 view_count(숫자)가 있는 GSI
참고:클라이언트가 이미 동일한 지역(US-West-1)에 있으므로 전역 테이블을 사용할 수 없습니다.
코드를 확인하세요.
몽고DB(아틀라스)
리전:AWS N. 버지니아(us-east-1)
클러스터 등급:M5(일반)
색인:섹션 및 view_count의 복합 색인
참고:MongoDB 서버리스 제품을 사용해 보고 싶지만 Node.js 드라이버가 없습니다. 하지만 내가 레이턴시를 계산하는 부분 밖에 db 연결을 유지하기 때문에 문제가 되지 않습니다.
코드를 확인하세요.
파이어스토어
지역:GCP 미국 중부
모드:데이터 저장소
인덱스:섹션(오름차순) 및 view_count(내림차순)의 복합 인덱스
코드를 확인하세요.
카산드라(Datastax Astra)
리전:AWS US-East-1
요금제:사용한 만큼 지불
인덱스:PRIMARY KEY(섹션, view_count, id)
API:REST API
코드를 확인하세요.
동식물DB
요금제:개인(월 $25)
색인:term=section, value=view_count
API:FQL
코드를 확인하세요.
레디스(업스태시)
리전:AWS US-West-1
요금제:사용한 만큼 지불합니다.
인덱스:SortedSet이 사용됩니다.
참고:단일 및 다중 영역 데이터베이스는 별도로 테스트됩니다.
코드를 확인하세요.
특별 참고 사항
- FaunaDB는 기본적으로 더 나은 일관성 보장과 전역 복제를 제공합니다. 또한 배포할 지역을 선택할 수 없습니다. 이것이 상대적으로 낮은 성능의 이유일 수 있습니다.
- Firestore는 다른 제품과 성능이 비슷하지만 차이가 더 큽니다. 콜드 연결의 오버헤드가 있기 때문일 수 있습니다. 연결을 유지하는 방법을 찾지 못했습니다. 이에 대한 아이디어가 있으면 알려주세요.
- Cassandra는 기본 키 필드 업데이트를 허용하지 않습니다. 인덱스를 많이 업데이트할 경우 보조 인덱스를 사용하지 않는 것이 좋습니다. 따라서 성능에 긍정적인 영향을 줄 수 있는 view_count를 업데이트할 수 없었습니다.
- Upstash 단일 영역이 약간 더 빨라 보이지만 Upstash의 단일 영역 설정과 다중 영역 설정 간에 큰 성능 차이는 없습니다. REST API는 더 높은 백분위수에서 네이티브 API에 매우 가까운 성능을 보입니다.
이는 지속적인 노력이므로 벤치마크의 품질을 개선하기 위해 계속 코드를 리팩토링할 것입니다. 제품 코드를 리팩토링할 때 히스토그램을 재설정합니다. 코드를 확인하고 개선할 사항이 있으면 알려주십시오. 트위터 및 디스코드로 문의하실 수 있습니다.