使用 Deno KV 中的新“watch”API 构建实时应用程序
Deno KV 是我们内置于运行时、符合 ACID 原则的键值数据库,它通过消除样板代码和配置,向我们彻底简化云开发的愿景迈出了一大步。您无需费心处理 API 密钥和数据库配置,只需一行代码即可连接到数据库
const kv = await Deno.openKv();
我们不断为 Deno KV 提供大量新功能,例如一个开源的自托管服务器、远程连接到托管 Deno KV 实例的能力,以及持续备份到对象存储。但今天,我们推出一项新功能,它将**简化构建一整类实时应用程序的过程 —— `kv.watch`:**
let seen = "";
for await (const [messageId] of kv.watch([["last_message_id", roomId]])) {
const newMessages = await Array.fromAsync(kv.list({
start: ["messages", roomId, seen, ""],
end: ["messages", roomId, messageId, ""],
});
await websocket.write(JSON.stringify(newMessages));
seen = messageId;
}
自 Deno 1.38.5 和 Deno Deploy 起支持,`kv.watch` 允许您监听 Deno KV 键的更改,从而简化构建
- 实时 UI 更新,例如社交媒体新闻源或通知
- 聊天应用程序或聊天室,如 Slack 和 Discord
- 协作编辑器,如 Google Docs
在本篇博客文章中,我们将介绍
()` 👀 函数
新的 `.新的 `.watch()` 函数接受一个键数组,并返回一个 `ReadableStream`,每当被监听的键的 `versionstamp` 发生变化时,它就会发出一个新值。
在下面的示例中,我们监听键 `["foo"]` 和 `["bar"]` 的更新
const db = await Deno.openKv();
const stream = db.watch([["foo"], ["bar"]]);
for await (const entries of stream) {
entries[0].key; // ["foo"]
entries[0].value; // "bar"
entries[0].versionstamp; // "00000000000000010000"
entries[1].key; // ["bar"]
entries[1].value; // null
entries[1].versionstamp; // null
}
请注意,单次 `kv.watch` 调用中最多可以传递 10 个键。
要将 `kv.watch` 添加到网站或应用程序中,您需要将其与服务器发送事件(Server-Sent Events)或 WebSockets 结合使用。
构建实时更新
为了更实际的示例,以下代码使用 `kv.watch` 监听帖子评论和点赞数的更改,然后通过 服务器发送事件(server-sent events) 将它们分派给客户端
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
const router = new Router();
// Send server side event on every activity on this blog post.
router.get("/api/blog_post_updates", async (ctx) => {
const target = ctx.sendEvents();
const postId = ctx.url.searchParams.get("post_id");
for await (
const [{ value: lastCommentId }, { value: likeCount }] of kv.watch([
["lastCommentId", postId],
["likeCount", postId],
])
) {
target.dispatchMessage({ lastCommentId, likeCount });
}
});
app.use(router.routes());
await app.listen({ port: 80 });
客户端需要在 `/api/blog_post_updates` 端点创建连接。然后,客户端将接收包含新评论和点赞数的服务器端事件,并可以在 HTML 中渲染它们。UI 将无需页面重新加载即可渲染更新。
在 Deno Deploy 上监听更新
Deno Deploy 上的 Deno KV 是一个一体化解决方案,提供可扩展、可靠且符合 ACID 原则的存储,具备构建现代应用程序所需的所有必要原语
无论隔离环境在哪个区域运行,`kv.watch` 变更通知都会以最小的延迟传递到隔离环境。凭借我们基于 FoundationDB 构建的高性能事务处理架构,`kv.watch` 可以扩展到数十万并发客户端。
定价
Deno Deploy 上的 Deno KV 定价没有变化。但是,每次从 `kv.watch` 的 `ReadableStream` 响应中返回条目时,都算作一次“读取”。
更多用例和示例
为了提供更多 `kv.watch` 的使用示例,我们更新了 Deno KV 演示应用程序以包含 KV watch
这些示例让您了解可以使用 Deno KV watch 构建的实时或多用户协作应用程序。
更多资源
下一步是什么
Deno KV,以及 Deno Queues 和 Deno Cron 等其他云原语,都直接内置于运行时中,让您无需担心配置、预置或扩展基础设施,即可更快地进行构建。Deno KV 的新 `kv.watch` 通过让您检测 Deno KV 的更改,进一步简化了实时应用程序的构建。
我们始终欢迎反馈和功能请求!请随意加入我们不断壮大的 Discord 社区或在此处创建问题。
我们刚刚发布了 Deno Cron!🦕🕒
在 Deno Deploy 上几分钟内创建定时任务。