Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

So sánh Database Serverless: DynamoDB, Firestore, MongoDB, Cassandra, Redis và FaunaDB

Đây là phần tiếp nối của bài viết đăng tháng 4/2021.

Chúng tôi đã xây dựng một ứng dụng mẫu so sánh hiệu suất của các database serverless hàng đầu thông qua một trường hợp sử dụng web phổ biến và serverless functions. Các database được test bao gồm: DynamoDB, MongoDB Atlas, Firestore, Cassandra (Datastax Astra), FaunaDB và Redis (Upstash).

Xem ứng dụng demo và mã nguồn.

Phương pháp so sánh

Chúng tôi đo độ trễ khi truy xuất top 10 bài báo theo section "World" từ từng database. Toàn bộ dữ liệu gồm 7.001 bài báo thực tế từ New York Times API. Câu truy vấn được đo:

select * from news where section = "World" order by view_count desc limit 10

Backend được triển khai dưới dạng serverless functions trên AWS Lambda (Google Cloud Function cho Firestore). Chúng tôi đặt functions và databases cùng region (khi có thể) để giảm thiểu độ trễ mạng.

Thời gian kết nối database bị loại khỏi phép đo. Timestamp được ghi ngay trước và sau câu truy vấn. Độ trễ được đo tại backend (bên trong serverless function) nên không bao gồm độ trễ mạng giữa browser và server, cũng không bị ảnh hưởng bởi cold start của function.

Để mô phỏng dữ liệu thực tế thay đổi liên tục, chúng tôi gán giá trị view_count ngẫu nhiên cho top 10 bài báo. Mỗi lần truy vấn buộc database trả về tập kết quả khác nhau, ngăn chặn việc sử dụng cache. Các thao tác cập nhật không được tính vào độ trễ.

Kết quả độ trễ tính đến ngày 25/8:

So sánh Database Serverless: DynamoDB, Firestore, MongoDB, Cassandra, Redis và FaunaDB

Cấu hình chi tiết từng Database

DynamoDB

  • Region: US-West-1
  • Read/Write Capacity: 50 (mặc định là 5)
  • Index: GSI với partition key là section (String) và sort key là view_count (Number)
  • Lưu ý: Global Tables không được bật vì client đã cùng region (US-West-1)

Xem mã nguồn DynamoDB.

MongoDB Atlas

  • Region: AWS N. Virginia (us-east-1)
  • Cluster Tier: M5 (General)
  • Index: Compound index trên section và view_count
  • Lưu ý: MongoDB serverless offering chưa có Node.js driver lúc test, nhưng không ảnh hưởng vì connection được giữ ngoài phần tính độ trễ.

Xem mã nguồn MongoDB.

Firestore

  • Region: GCP US-Central
  • Mode: Datastore
  • Index: Composite index trên section (ascending) và view_count (descending)

Xem mã nguồn Firestore.

Cassandra (Datastax Astra)

  • Region: AWS US-East-1
  • Plan: Pay as you go
  • Primary Key: (section, view_count, id)
  • API: REST API

Xem mã nguồn Cassandra.

FaunaDB

  • Plan: Individual ($25/tháng)
  • Index: term=section, value=view_count
  • API: FQL

Xem mã nguồn FaunaDB.

Redis (Upstash)

  • Region: AWS US-West-1
  • Plan: Pay as you go
  • Cấu trúc dữ liệu: SortedSet
  • Lưu ý: Single-zone và multi-zone được test riêng biệt.

Xem mã nguồn Redis.

Ghi chú đặc biệt

  • FaunaDB: Có đảm bảo consistency mạnh và global replication mặc định. Không cho chọn region triển khai. Đây có thể là nguyên nhân hiệu suất thấp hơn.
  • Firestore: Hiệu suất tương đương các DB khác nhưng variance lớn hơn. Có thể do overhead cold connections. Chưa tìm cách keep-alive connection.
  • Cassandra: Không cho update primary key fields. Secondary indexes không khuyến khích nếu update nhiều. Không thể update view_count, có thể ảnh hưởng tích cực đến hiệu suất.
  • Upstash: Single zone hơi nhanh hơn multi-zone nhưng chênh lệch không lớn. REST API có hiệu suất gần native API ở các percentile cao.

Đây là nỗ lực liên tục, chúng tôi sẽ tiếp tục refactor code để cải thiện chất lượng benchmark. Khi refactor code của sản phẩm nào, histogram của sản phẩm đó sẽ được reset. Hãy xem code và cho biết nếu có chỗ cải thiện. Liên hệ qua Twitter và Discord.