跳至主要内容
Deno 2 终于来了 🎉️
了解更多
Deno KV watch

使用 Deno KV 中新的 "watch" API 构建实时应用程序

Deno KV 是我们内置于运行时的 ACID 兼容键值数据库,它朝着我们彻底简化云开发的愿景迈出了一大步,通过消除样板代码和配置。 您无需再处理 API 密钥和配置数据库,而只需一行代码即可连接到数据库。

const kv = await Deno.openKv();
而且,如果您将其与 Deno Deploy 一起使用,您的数据可以全局复制,并且无需任何进一步设置即可扩展。

我们一直在为 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;
}
使用 kv.watch 的实时聊天应用程序。

Deno 1.38.5Deno Deploy 开始支持,kv.watch 允许您监听 Deno KV 密钥的更改,从而简化构建

  • 实时 UI 更新,例如社交媒体新闻提要或通知
  • 聊天应用程序或聊天室,例如 Slack 和 Discord
  • 协作编辑器,例如 Google 文档

在本博文中,我们将介绍

在上面的 YouTube 视频中了解新的 watch 功能。

新的 .watch() 👀 函数

新的 .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 添加到网站或应用程序中,您需要将其与服务器端事件或 WebSockets 一起使用。

构建实时更新

为了提供更实际的示例,以下代码使用 kv.watch 监听帖子的评论和点赞数的更改,然后使用 服务器发送事件 将其分发到客户端。

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.watchReadableStream 响应中返回一个条目时,它都将被视为一次“读取”。

更多用例和示例

为了提供更多关于使用 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 上几分钟内创建计划作业。