Deno KV internals: building a database for the modern web

Bài tóm tắt Deno 2023 2. Tăng trưởng Độ khó: Khó

Deno · 2023 · 2. Tăng trưởng · Độ khó: Khó — bài gốc

Bài giới thiệu nội bộ một sản phẩm của nhà cung cấp (Deno). Không có số liệu throughput/latency; mọi nhận định là theo Deno.

Bối cảnh

  • Deno Deploy chạy code ở nhiều region. Theo Deno, khách hàng nói: compute phân tán mà dữ liệu không phân tán thì mất lợi ích về latency.
  • Mục tiêu của Deno KV: scale được, ít round-trip, API theo kiểu JavaScript, giao dịch nguyên tử, cùng một API cho local và global. Có hai bản cài đặt: SQLite (local/test) và bản phân tán cho production.

Thay đổi chính

  • Xây trên FoundationDB (dùng cho iCloud và Snowflake), vì nó đã kiểm chứng bằng deterministic simulation và cung cấp KV có giao dịch. FoundationDB lo phần khó: sharding, replication đồng bộ trong cụm, serializable/linearizable, lưu bền.
  • Nhưng FoundationDB không có sẵn ba thứ: cấu hình theo từng tenant (replication, backup, quota khác nhau); kiểu dữ liệu JS (ví dụ cộng nguyên tử trên bigint); và giao dịch không tương tác. Deno dựng một transaction layer ở trên.
  • Giao dịch không tương tác: mọi atomic op gói thành một "túi" gồm: điều kiện (kiểm tra versionstamp của key), lệnh ghi (set/delete), và mutation không xung đột (ví dụ sum). Hoàn tất trong 1–2 round-trip, thay vì nhiều lượt như giao dịch tương tác. Giao dịch tương tác qua khoảng cách địa lý thì latency cộng dồn.
  • Pipeline sequencer → evaluator → writer:
    • Sequencer (một cho mỗi database) cấp TSN (số thứ tự giao dịch) tăng đơn điệu từ bộ đếm trong RAM; thứ tự TSN chính là thứ tự tuyến tính hoá.
    • Evaluator xử lý theo lô, dựng đồ thị luồng dữ liệu giữa điều kiện, lệnh ghi và mutation (dùng cổng AND/MUX), rồi tính song song tối đa. Kết quả giữ trong RAM để thực thi suy đoán cho các lô sau, trước khi nó bền trên đĩa.
    • Writer ghi kết quả xuống FoundationDB theo lô, ghi replication log, xếp key hết hạn (TTL).
  • Hiệu ứng của giao dịch chỉ hiện ra bên ngoài khi đã commit vào FoundationDB.

Bài học cho SWE

  • Dùng một lõi phân tán đã kiểm chứng và tự xây lớp ngữ nghĩa ở trên. Inngest 2026 cũng chọn FoundationDB làm lõi (Chọn database theo workload).
  • Thiết kế API giao dịch theo latency: với hệ đa region, giao dịch không tương tác (gửi một lần cả điều kiện lẫn lệnh) rẻ hơn nhiều so với giao dịch tương tác (Giao dịch phân tán và nhất quán xuyên service).
  • Một sequencer trung tâm không nhất thiết là nút thắt nếu nó chỉ làm việc rẻ nhất (tăng bộ đếm), phần nặng thì song song hoá ở chỗ khác.
  • Thực thi suy đoán đổi độ phức tạp lấy throughput khi có tranh chấp trên cùng key.

Liên quan