Announcing Deno Queues

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

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

Bài thông báo sản phẩm, chủ yếu là API và ví dụ; không có số liệu. Đọc cùng Deno 2023 (lớp giao dịch của Deno KV mà Queues dựa vào).

Bối cảnh

  • Deno KV (beta, xây trên FoundationDB) ra mắt vài tháng trước. Queues là primitive thứ hai: đẩy việc ra chạy nền hoặc hẹn giờ, không phải dựng hạ tầng queue riêng.

Thay đổi chính

  • Hai API: enqueue() (gửi ngay hoặc kèm delay) và listenQueue() (handler). Chạy local thì trên SQLite, trên Deno Deploy thì trên FoundationDB; Deploy tự bật V8 isolate khi có message.
  • At-least-once: đa số message gọi handler một lần, khi lỗi có thể nhiều lần; ứng dụng phải chịu được trùng.
  • Gắn với giao dịch KV: có thể enqueue trong cùng một giao dịch nguyên tử với lệnh ghi KV (cùng thành công hoặc cùng thất bại), và cập nhật KV trong handler bằng giao dịch nguyên tử để mỗi message chỉ có hiệu lực một lần.
  • Handler ném lỗi thì runtime thử lại tới tối đa 5 lần (mặc định); hết lượt thì message bị bỏ.
  • Tính tiền theo thao tác KV: enqueue = một lần ghi; nhận = một lần ghi + một request.

Vì sao

  • Khi queue nằm cùng kho có giao dịch với dữ liệu, "ghi dữ liệu + phát việc" thành một giao dịch, tức là có sẵn ngữ nghĩa của outbox mà không cần bảng outbox và relay riêng (Event-driven, message queue và Kafka).

Bài học cho SWE

  • At-least-once đòi handler idempotent; ở đây dùng chính giao dịch của kho để ghi nhận "đã xử lý".
  • Kiểm hành vi khi hết lượt retry: mặc định bỏ message là mất việc âm thầm nếu không có dead letter hay giám sát.
  • Queue đi kèm DB có giao dịch (Deno KV, sau này Inngest trên FoundationDB) là một lựa chọn khác với broker riêng.

Liên quan