当你听到“无服务器”这个词时,我打赌你会开始考虑 AWSGCPMS Azure。这些是这个领域的顶级球员,对吧?您可能还会想到 DigitalOceanLinodeNetlify FunctionsZeit Serverless Functions,甚至 Firebase(尽管它在技术上是 GCP 的一部分)。

这些服务很棒,因为它们提供了令人印象深刻的可扩展性,无需维护,并且通常带有慷慨的免费层。但是,这里没有列出一个无服务器平台,我想你可能甚至都不知道。

我说的是 Cloudflare Workers - 来自 Cloudflare(顶级 CDN 提供商)的独特服务,其功能类似于 Firebase Cloud Functions 等(Function as a Service - FaaS)。这听起来可能不多,但相信我——它的袖子里有几张王牌。

注意! 澄清一下,我绝不是 Cloudflare 赞助或附属的。我通过它的免费套餐为我的产品使用了该服务 - CodeWrite(开发人员最好的博客工具) - 并认为它值得一读!

Cloudflare Workers 功能

让我们首先概述一下该平台的顶级独特功能。

全球网络

首先,它利用了 Cloudflare 的全球网络,由于 大大减少了延迟,它可以实现更快的响应时间。当然,“标准”无服务器特性也适用——即可扩展性、免维护等。

0ms冷启动,V8隔离

现在,这个功能真的很有趣。 Cloudflare 为其 Workers 服务宣传 0ms 冷启动,这意味着您的代码在被调用时几乎可以立即运行。

有趣的是它是如何实现的。通常,大多数云功能服务通过启动容器来处理传入请求来按需运行您的代码。这一切都发生得非常快,但不是在 0 毫秒。

V8 隔离

Cloudflare Workers 以一种非常独特的方式解决了这个问题。它不是在容器中运行您的代码,而是在他们所谓的“V8 隔离”_ 中运行它。基本上,为所有 Chromium 浏览器、Node.js 和 Electron 提供支持的相同JavaScript 引擎的隔离实例。 V8 快速启动并运行您的代码。

话虽如此,这种方法确实有一些缺点。

它是 V8 隔离的事实不仅意味着它快速和轻量级,而且它的功能有限。它与可以在容器中运行的成熟的 Node.js 不同,而是一个独立的 V8“沙箱”。

这意味着您只能使用个内置 JS API、Web API 的子集(从浏览器环境中知道的那些),并提供 Cloudflare Workers API。因此,例如,您必须使用Fetch API而不是http模块,您不能使用原生、CommonJS 甚至 ESM 模块(即使它是类似浏览器的 V8 环境,ESM 模块也被禁用并且可以使用只能通过捆绑器),您不能使用大多数 NodeJS 或浏览器全局变量(如processwindowdocument)以及与 DOM 相关的 API。

现在,这听起来像是你必须放弃的一大堆东西——而且确实如此。但老实说,你剩下的对于很多用例来说都很好。托管静态站点、创建代理和运行 API 服务——所有这些以及更多都可以通过 CF Workers 实现。

不只是JS

抛开不同的 JS 特性集,重要的是要注意,在 CF Workers 中,您可以使用JS 以外的语言。感谢 V8 WebAssembly 支持,您可以使用 WASM 可编译语言,例如 Rust、C 或 C++。此外,使用一些 to-JS 处理器,您可以使用大量其他语言,您可以在官方文档中看到这些示例。

话虽如此,在这篇文章中,我们只关注 JavaScript。

实惠

CF Workers 最后一个值得注意的,可能也是最重要的优势是可负担性

Cloudflare Workers 提供慷慨的免费套餐,涵盖每日 10 万个请求。 Cloudflare Workers 存储解决方案 - KV,我们稍后会详细讨论,它还提供免费使用限制 - 1GB 存储、100K 读取以及每天 1K 列表、写入和删除。

至于付费计划,下限为 $5/month,每月可提供 1000 万次请求(相比之下,免费约 300 万次,每日限制为 10 万次)、1GB 存储空间、1000 万次 KV 读取和 100 万次其他一切与 KV 相关。除了 KV 写入、删除和列表为 5 美元/百万美元之外,任何高于此值的都是 0.50 美元/百万美元或 GB。

现在,我想花点时间欣赏一下,我刚刚分两段向您展示了整个 CF Workers定价结构。没有使用内存、运行时间、带宽等 - 在无服务器世界中看到如此清晰的定价真是令人耳目一新,你的一举一动都需要付费!

您可能已经注意到,这些 KV 存储写入、删除和列表似乎是其中最昂贵的——即使与其他无服务器产品相比也是如此。让我们看看KV是什么,为什么定价这么高!

工人KV

KV(Key-Value 的缩写)是针对 Cloudflare Workers 的基于键值的数据存储解决方案。它在 Cloudflare 的全球网络上运行,延迟低,并且_“最终保持一致”。_

现在,这最后一句话是理解 KV 的架构的关键。你看,KV 提供了真正的快速读取速度,这要归功于运行 _“on the edge”,这意味着最接近客户端。另一方面,这意味着(不幸的是)任何写入或删除都需要更长的时间才能在整个网络中传播(即实现“最终一致性”)。最多 60 秒。这使得 Workers KV 非常适合任何类型的密集读取场景,例如静态网站、配置和用户数据,这些场景不会经常发生变化。但是,任何类型的实时同步,当数据需要快速更改,并且新的更新必须尽快让每个人都看到时——这是不行的。

因此,Workers KV 架构是高定价及其限制(但也是功能)的来源。最重要的是,它简单的键值模型并没有让事情变得更好。不过,它仍然适用于静态数据。

值得注意的是,即将推出的 Cloudflare Workers 存储解决方案将涵盖 KV 没有的大多数用例。它被称为Durable Objects,但在撰写本文时,它处于封闭测试阶段。

CF 工人限制

我们已经讨论了很多 Cloudflare Workers 的限制。但是,还有一些值得一提的。

环境限制

除了不同计划的限制外,还有一些与运行时环境相关的限制。它们是 128MB 内存、10 毫秒或 50 毫秒(付费计划)的 CPU 运行时间、50 个子请求(您的工作人员为响应传入请求而发出的请求)和 6 个同时连接。请注意,由于 Cloudflare Workers 的本质,您不太可能达到这些限制。

您可能会遇到 1MB 脚本限制。单个工作脚本仍然可以处理许多不同的请求,但它必须保持在 1MB 以下。使用原始 JS,您不太可能达到此限制,但在使用捆绑程序和一些第三方库时 - 您应该小心。

话虽如此,如果你确实达到了这个限制,那么你应该考虑将你的代码分散到多个脚本中。您最多可以拥有其中的 30 个。

无论您是否使用付费计划,上述两个限制都适用。

千伏限制

KV 存储也有相当多的限制,尽管并不那么令人担忧。最多 100 个命名空间(将它们视为为您的键值数据组织存储桶),最多 512 B 的键和 25 MB 的值(即使是高质量的图像也足够),每个最多 1 次写入第二个给定的键。

在 KV 中,您可以存储以下类型的值:stringReadableStreamArrayBuffer,以及一些元数据(最多 1024 B,单个键值对的 JSON 可序列化),所以基本上所有您需要的。

对于其他不太重要的限制,请查看官方文档。

用法和API

由于简单的、以 V8 为中心的架构,Cloudflare Workers 确实总体上易于使用。类似浏览器的 API 感觉比 Node.js 更容易,仪表板中内置的 Monaco 编辑器允许您创建简单的新工作人员并轻而易举地进行快速编辑!

[Cloudflare Workers 编辑器](https://res.cloudinary.com/practicaldev/image/fetch/s--ebs3UZO6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/fxgdtfx11df33ow3zr4t.png)

Cloudflare Workers 编辑器

现在,一个基本脚本如下所示:

addEventListener("fetch", (event) => {
  event.respondWith(handleRequest(event.request));
});

/**
 * Respond to the request
 * @param {Request} request
 */
async function handleRequest(request) {
  return new Response("hello world", { status: 200 });
}

进入全屏模式 退出全屏模式

除了自定义的fetch事件,其他一切都非常清晰的 JS。

这个事件处理程序是一切的起点。从那里,您收到Request对象,并适当地处理请求。

从这里,您很可能会检查请求 URL、请求方法、查询参数或请求正文中是否有任何数据,并对这些信息做任何您需要的事情。您甚至可以访问fetch()个远程资源,而无需担心 CORS!

KV使用量

至于 KV 存储,它的 API 类似于许多其他键值存储(甚至是LocalStorage)。

您首先将命名空间分配给一个 Worker 脚本变量,然后从那里开始。所有方法(put()get()list()delete())都将在此变量的对象下可用。以下是他们的签名(在 TypeScript 中):

type Value = string | ReadableStream | ArrayBuffer;
type ValueType = "text" | "json" | "arrayBuffer" | "stream";

interface NAMESPACE {
  /**
   * Set key-value in storage.
   * @param key - Key.
   * @param value - Value.
   * @param options - Additional options.
   */
  put(
    key: string,
    value: Value,
    options?: {
      /** Seconds since epoch */
      expiration?: number;
      /** Seconds from now */
      expirationTtl?: number;
      /** JSON-serializable metadata */
      metadata?: object;
    }
  ): Promise<void>;

  /**
   * Retrieve value by key.
   * @param key - Key to be retrieved.
   * @param type - Expected value's data type for easy conversion (default "text").
   */
  get(key: string, type?: ValueType): Promise<Value | null>;

  /**
   * Retrieve value by key. (including metadata)
   * @param key - Key to be retrieved.
   * @param type - Expected value's data type for easy conversion (default "text").
   */
  getWithMetadata(
    key: string,
    type?: ValueType
  ): Promise<{
    value: Value;
    metadata: object;
  }>;

  /**
   * Remove key-value pair.
   * @param key - Key to be removed.
   */
  delete(key: string): Promise<void>;

  /**
   * List all the keys in the namespace.
   * @param options - Listing options.
   */
  list(options?: {
    /** String that represents a prefix you can use to filter all keys */
    prefix?: string;
    /** Maximum number of keys returned. Limited to 1000 (default 1000) */
    limit?: number;
    /** String used for paginating responses. */
    cursor?: string;
  }): Promise<{ value: string[]; cursor: string }>;
}

// Will be used like so:
(NAMESPACE_BINDING as NAMESPACE).put("example", "Hello World!").then(() => {
  console.log("Done!");
});

进入全屏模式 退出全屏模式

结束语

Cloudflare Workers 是一个非常有趣的平台,具有独特的功能。除了 KV 存储之外,它还非常实惠、高性能且易于使用。

就个人而言,我在为我的最新项目CodeWrite(开发人员的博客工具)寻找一个好的无服务器平台时偶然发现了它。尽管它主要是一个离线工具,但 CF Workers 仍然处理基本的分析、许可、CORS 代理和整个登录页面。到目前为止,一切都很顺利,在这个初始增长阶段,免费计划已经足够了。

那么,您对 Cloudflare Workers 有何看法?你知道他们吗,还是你第一次听说他们?在下面的评论部分让我知道你的想法 - 我很好奇!

与往常一样,在Twitter、Facebook或通过我的时事通讯关注我以了解最新内容,如果您打算创建自己的技术博客,不妨试试 CodeWrite!

感谢阅读,祝您编码愉快!

由于CodeWrite具有出色的编辑器、流畅的语法集成和“一键式发布”,这篇文章写得轻松,语法正确,并在 1 次点击内交叉发布。免费试用,并使用代码first100获得 20% 折扣 您的订阅(仅 $2.40/月!)

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐