合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 怎么运行的 尽管Cloudflare Workers在浏览器或Node.js中的行为类似于JavaScript,但在代码思考方式方面还是存在一些细微的差异。在后台,Workers运行时使用[V8引擎](https://v8.dev/)\-Chromium和Node.js使用相同的引擎。Workers运行时还实现了大多数现代浏览器中可用的许多标准[API](https://developers.cloudflare.com/workers/reference/runtime/apis)。 为浏览器或Node.js编写的JavaScript之间的差异发生在运行时。Workers功能不是在个人计算机(例如浏览器应用程序或中央服务器)上运行,而是在[Cloudflare的边缘网络](https://www.cloudflare.com/network/)上运行[\-Cloudflare的边缘网络](https://www.cloudflare.com/network/)是一个不断发展的全球性网络,分布在数百个位置的数千台计算机组成。 ![网络](https://developers.cloudflare.com/workers/about/media/network-map.png) 这些计算机中的每一个都承载一个Workers运行时的实例,并且每个运行时都能够运行成千上万个用户定义的应用程序。本指南将介绍其中的一些差异,并帮助您更深入地研究这些差异。 我们将从三个最大的差异开始:隔离度,每个请求计算和分布式执行。 ## 隔离物 V8协调隔离:轻量级上下文,将变量与允许其变异的代码分组在一起。您甚至可以考虑将隔离运行为功能的“沙盒”。 一个运行时可以运行成百上千个隔离,在它们之间无缝切换。每个隔离区的内存都是完全隔离的,因此在运行时,每个代码段都可以免受其他不受信任或用户编写的代码的影响。隔离也可以快速启动。无需为每个功能创建虚拟机,而是在现有环境中创建隔离。该模型消除了虚拟机模型的冷启动。 ![进程与隔离](https://developers.cloudflare.com/workers/about/media/isolates.png) 与其他使用容器化进程的无服务器提供程序不同,每个提供程序都运行语言运行时的实例,Workers在边缘容器启动时就一次支付JavaScript运行时的开销。通过为每个Workers函数调用创建隔离,Workers进程能够运行几乎没有单独开销的实质上无限的脚本。任何给定的隔离都可以比容器或虚拟机上的Node进程快约一百倍地启动。值得注意的是,启动时隔离株消耗的内存少一个数量级。 给定的隔离群具有其自身的范围,但是隔离群不一定是长期存在的。隔离物可能会被旋转并驱逐,原因有以下几种: * 机器上的资源限制 * 可疑脚本-任何被视为试图突破隔离沙箱的脚本 * 个别[资源限制](https://developers.cloudflare.com/workers/about/limits) 因此,通常建议您不要在全局范围内存储可变状态,除非您已考虑了这种偶然性。 如果您对我们如何使用Workers运行时处理安全性感兴趣,可以[阅读有关隔离与安全性和幽灵威胁缓解的关系的更多信息](https://developers.cloudflare.com/workers/about/security)。 ## 按请求计算 大多数工作程序脚本是默认工作程序流的变体: ~~~javascript addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) /** * Fetch and log a request * @param {Request} request */ async function handleRequest(request) { return new Response('Hello worker!', { status: 200 }) } ~~~ 当Cloudflare的任何运行时收到对worker.dev子域或Cloudflare管理的域的请求时,Workers脚本都会将[`FetchEvent`](https://developers.cloudflare.com/workers/reference/apis/fetch-event)参数传递给脚本中定义的事件处理程序。在该处,您可以[`Response`](https://developers.cloudflare.com/workers/reference/apis/response)通过现场计算响应,使用[`fetch`](https://developers.cloudflare.com/workers/reference/apis/fetch)等等调用另一台服务器来生成一个。到达`respondWith`调用点所花费的CPU周期都对计算时间有所贡献。例如,`setInterval`超时不会在等待时消耗CPU周期。 **您的帐户根据脚本处理的请求数计费,而不是根据计算时间计费。** ### 进一步阅读 * [有关FetchEvents的更多信息](https://developers.cloudflare.com/workers/reference/apis/fetch-event) * [有关请求上下文的更多信息](https://developers.cloudflare.com/workers/about/tips/request-context) * [有关运行时限制的更多信息](https://developers.cloudflare.com/workers/about/limits) ## 分布式执行 隔离是有弹性的,并且在请求期间可以连续使用,但是在极少数情况下,可能会将隔离逐出。当脚本达到我们的[极限时,](https://developers.cloudflare.com/workers/about/limits)或者当运行请求的计算机上的资源异常紧张时,在正确解决事件*后*,运行时将有选择地逐出隔离。 与所有其他JavaScript平台一样,单个Workers实例可以处理多个请求,包括在单线程事件循环中的并发请求。不能保证任何两个请求都将落在同一实例中。因此,*不建议在事件处理程序中设置或更改全局状态*。您可以通过阅读[有关处理状态的更多信息](https://developers.cloudflare.com/workers/reference/storage/overview)来了解更多[信息](https://developers.cloudflare.com/workers/reference/storage/overview)。