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

Benchmark Serverless Databases: So sánh Latency DynamoDB, FaunaDB, Upstash (Redis)

Bài viết so sánh latencies của 3 serverless databases: DynamoDB, FaunaDB, Upstash (Redis) cho common web use case.

Tạo sample news website, record database-related latency mỗi request. Xem website và source code.

Insert 7001 NY Times articles vào từng database. Articles từ New York Times Archive API (tất cả articles tháng 1/2021). Random score mỗi article. Mỗi page request, query top 10 articles section World từ mỗi database.

Dùng serverless functions (AWS Lambda) load articles từ từng database. Response time fetch 10 articles recorded as latency inside lambda. Lưu ý: recorded latency chỉ giữa lambda và database, không phải latency browser-server.

Sau mỗi read request, update scores randomly simulate dynamic data. Phần này exclude khỏi latency calculation.

AWS Lambda Setup

  • Region: US-West-1
  • Memory: 1024Mb
  • Runtime: nodejs14.x

DynamoDB Setup

Tạo DynamoDB table US-West-1, read/write capacity 50 (mặc định 5). Index: GSI partition key section (String), sort key view_count (Number).

Benchmark Serverless Databases: So sánh Latency DynamoDB, FaunaDB, Upstash (Redis)

FaunaDB Setup

FaunaDB globally replicated, không chọn region. Dùng FQL, assume GraphQL API có overhead. Tạo index terms section, values ref, non-serialized để improve performance.

CreateIndex({
  name: "section_by_view_count",
  unique: false,
  serialized: false,
  source: Collection("news"),
  terms: [{ field: ["data", "section"] }],
  values: [{ field: ["data", "view_count"], reverse: true }, { field: ["ref"] }]
})

Redis Setup

Tạo Standard type database US-West-1 region Upstash. Dùng Sorted Set per news category. Tất cả World news articles trong Sorted Set key World.

Initialize Databases

Download 7001 news articles JSON từ NYTimes API, tạo NodeJS script per database read JSON insert records. Files: initDynamo.js, initFauna.js, initRedis.js

Query DynamoDB

Dùng AWS SDK connect DynamoDB. Giữ connection alive minimize latency. Dùng perf_hooks measure response time. Record time trước query top 10 articles. Tính latency ngay khi có response. Random score articles, insert latency vào Redis sorted set (ngoài latency calculation). Code đầy đủ tại đây.

Query FaunaDB

Dùng faunadb library connect/query. Giữ connection alive, dùng perf_hooks. Tương tự DynamoDB code. Code đầy đủ tại đây.

Query Redis

Dùng ioredis connect/read Redis Upstash. Dùng ZREVRANGE load data từ Sorted Set. Reuse connection tạo Redis client outside function. Tương tự update scores, send latency cho histogram. Code đầy đủ tại đây.

Histogram Calculation

Dùng hdr-histogram-js library calculate histogram. JS implementation của Gil Tene's hdr-histogram library. Code lambda function nhận latency numbers tính histogram tại đây.

Kết quả

Check website cho latest results. Latest histogram data. Kết quả ngày 12/4/2021: Upstash lowest latency (~50ms at 99th percentile), FaunaDB highest (~900ms at 99th percentile), DynamoDB (~200ms at 99th percentile).

Benchmark Serverless Databases: So sánh Latency DynamoDB, FaunaDB, Upstash (Redis)

Cold Start Effect

Mặc dù chỉ measure query part, cold start vẫn ảnh hưởng. Optimize code reuse client connections. Lợi ích khi Lambda container hot. Khi AWS kill container (cold start), code re-create client, overhead này. Trong application website, refresh page thấy latency giảm ~1ms Upstash, ~7ms DynamoDB.

Tại sao FaunaDB chậm (trong benchmark này)?

Trong FaunaDB status page, latency numbers ở hàng trăm. Assume config không flaws lớn. 2 lý do:

Strong consistency: Mặc định DynamoDB và Upstash eventual consistency cho reads. FaunaDB cung cấp Calvin-based strong consistency và isolation. Strong consistency có performance overhead.

Global replication: Upstash và DynamoDB config database và lambda cùng AWS region. FaunaDB data replicated worldwide, không option pick region. Nếu clients worldwide thì advantage. Nhưng deploy backend specific region thì gây extra latency.

Redis cho sub-millisecond latency. Tại sao không case này?

Tạo new Redis connection trong AWS Lambda gây overhead đáng kể. App không stable traffic, Lambda re-create connection (cold start) hầu hết thời gian. Phần lớn latency numbers trong histogram bao gồm connection creation time. Chạy job fetch website mỗi 15s, thấy Upstash latency giảm ~1ms. Refresh page thấy tương tự. Xem blog post optimize serverless low latency.

Coming Soon

Upstash sớm release Premium product replicate data sang multiple AZs. Sẽ add để xem effect của zone replication.

Feedback trên Twitter hoặc Discord.

Update

Có active discussion trên HackerNews về benchmark và Fauna performance. Applied suggestions, restart FaunaDB app. Đó là lý do số records FaunaDB trong histogram ít hơn others.