本页记录 2023 年之前的 Cloudflare Workers 变更。如需查看近期更新,请参阅当前更新日志。
- 已修复 R2 绑定 API 中的条件
PUT请求。
- Queues 不再支持以 undefined JavaScript 值作为消息调用
send()。
- 已更新
DOMException构造函数,使其更符合标准规范。具体而言,message和name参数现在可以是任何可强制转换为字符串的 JavaScript 值(此前,传入非字符串值会抛出异常)。 - 扩展了 R2 绑定 API,新增对 multipart 上传的支持。
- V8 更新:10.6 → 10.8
- 为
R2Checksums实现了toJSON(),使其可用于JSON.stringify()。
- 告警重试限制不再适用于由我方导致的错误。
- 已为多个标志(包括新的 streams 实现)添加兼容性日期。
DurableObjectStorage新增sync()方法,使 Worker 可以等待其写入(包括通过allowUnconfirmed执行的写入)与存储同步。
- 修复了一个 bug:如果 ES modules 语法脚本从顶层模块导出了数组类型的值,上传 API 会拒绝并返回
500错误 ↗。 console.log现在会打印有关某些对象(例如 Promise)的更多信息。- Workers Runtime 现在基于开源代码构建:GitHub - cloudflare/workerd: The JavaScript / Wasm runtime that powers Cloudflare Workers ↗。
- R2
put绑定选项现在可以包含类似get的onlyIf字段,用于条件上传。 - 允许在 R2 绑定中一次删除多个键。
- 在 R2
put选项中新增对 SHA-1、SHA-256、SHA-384、SHA-512 校验和的支持。 - 用户指定的对象校验和现在可在 R2
get/head绑定响应中获取。对于非 multipart 上传的对象,默认包含 MD5。 - 已将 V8 更新至 10.6。
- 带有
range头的Headers对象现在可用于R2GetOptions中getR2 绑定的范围请求。 - 当在
R2GetOptions中getR2 绑定的onlyIf中使用 headers 时,现在会正确按秒级精度进行比较。这使得与浏览器之间的往返转换正确无误。此外,secondsGranularity现在是可以手动传入的选项,在手动构造 options 而非使用 Headers 时可达到相同效果。 - 修复了 @cloudflare/workers-types ↗ 中
DurableObjectState.id的 TypeScript 类型,使其始终为DurableObjectId。 - Worker 上传模块脚本时的验证错误现在包含正确的行号和列号。
- Bug 修复:通过 Chrome 调试工具进行性能分析和火焰图时,现在能正确报告信息。
- 由于服务扩展问题,Workers Usage Report 和 Workers Weekly Summary 已停用。
- 全局网络预览模式下的
wrangler dev现在支持调度 alarm。 - 使用
range选项发起的 R2 GET 请求现在会在GetObject的range参数中包含返回的范围。 - 部分 Web Cryptography API 错误消息现在包含更多信息。
- 已将 V8 从 10.2 更新至 10.3。
- 使用旧
addEventListener语法的 Worker 脚本上的 Cron trigger 事件,如果未注册scheduled事件监听器,现在会被视为失败。 - 使用 DO alarm 不再需要显式提供
durable_object_alarms标志。
- 无外部可见变更。
- 现在可以创建标准
TransformStream实例来对数据进行转换。由于这会改变无参数new TransformStream()的默认行为,需要transformstream_enable_standard_constructor兼容性标志才能启用。 - Quick Edit 中的预览现在会正确使用 R2 绑定。
- 已将 V8 从 10.1 更新至 10.2。
- 静态
Response.json()方法可用于初始化带有 JSON 序列化 payload 的 Response 对象(参见 whatwg/fetch #1392 ↗)。 - 现在抛出的 R2 异常会在消息中以括号形式附加
error代码。这是临时方案,直到我们能够在抛出的Error对象上显式添加 code 属性。
- R2 绑定:
contentEncoding、contentLanguage和cacheControl现在能正确渲染。 - ReadableStream 的
pipeTo和pipeThrough现在支持使用AbortSignal取消。 - 在未实现
alarm()处理程序的 DO 中调用setAlarm()现在会抛出异常,而不是静默失败。在未实现alarm()处理程序时调用getAlarm()将返回 null,即使旧版 DO 类上曾设置过 alarm,因为不会执行任何操作。 - R2:对附加范围提供更好的运行时支持。
- R2 绑定现在支持带有
offset和可选length、带有length和可选offset,或suffix(返回文件最后N字节)的范围。
- 修复 R2 绑定将 cache-control 保存在 content-language 下并在 content-language 下渲染 cache-control 的问题。
- 修复 R2 绑定在无选项调用 list 时使用默认 list 限制而非永不返回任何结果的问题。
- 修复 R2 绑定未正确处理来自 R2 的错误消息,导致抛出
internal error的问题。同时修复 get 对不存在的键抛出异常而非返回 null 的行为。R2Error暂时移除,将在未来某个时间重新引入。 - R2 绑定:如果 onlyIf 条件导致前置条件失败或未修改结果,将返回不带 body 的对象,而不是返回 null。
- R2 绑定:移除 sha1 选项,因为它实际上未连接到任何功能。除 md5 之外的额外校验和选项待定。
- 在 Durable Object 存储 API 的
list()方法中新增startAfter选项。
Response.redirect(url)不再合并 URL 路径中出现的多个连续斜杠字符。- 修复 Date 的生成类型。
- 修复 R2 绑定在无选项调用 list 时使用默认 list 限制而非永不返回任何结果的问题。
- 修复 R2 绑定未正确处理来自 R2 的错误消息,导致抛出 internal error 的问题。同时修复 get 对不存在的键抛出异常而非返回 null 的行为。
R2Error暂时移除,将在未来某个时间重新引入。
- 小幅 V8 更新:10.0 → 10.1。
- R2 公开 Beta 绑定现在是默认值,无论兼容性日期或标志如何。内部 Beta 绑定客户应尽快过渡到公开 Beta 绑定。如果无法立即过渡,可使用向后兼容标志。经过一段延迟后,携带
r2_public_beta_bindings兼容性标志的新脚本将无法发布,直到移除该标志。
- 重大 V8 更新:9.9 → 10.0。
- 性能和稳定性改进。
- Web Cryptography API 中的 AES-GCM 实现现在会返回更友好的错误,说明不允许 0 长度的 IV。
- R2 错误响应现在包含更详细的细节。
- 引入了新的兼容性标志
minimal_subrequests,它会移除一些被无意应用于同 zonefetch()调用的功能。该标志将于 2022 年 4 月 5 日(周二)默认启用,详见 Workersminimal_subrequests兼容性标志。 - 使用 JavaScript 支持的 ReadableStream 创建
Response时,现在已实现Bodymixin 函数(例如await response.text())。 IdentityTransformStream创建了一个面向字节的TransformStream实现,仅将字节原样传递。TransformStream的可读端支持 BYOB 读取。需要注意的是,IdentityTransformStream与当前不符合规范的TransformStream实现相同,该实现将很快更新以符合 WHATWG Stream Standard。所有当前使用new TransformStream()的代码都应替换为new IdentityTransformStream(),以避免后续潜在的破坏性变更。
- 标准 ByteLengthQueuingStrategy ↗ 和 CountQueuingStrategy ↗ 类现已可用。
- 当设置
capture_async_api_throws标志时,返回 Promise 的内置 Cloudflare 特定 API 和 Web Platform Standard API 将不再同步抛出错误,而是返回 rejected promise。内存不足等致命错误除外。 - 修复 R2 发布日期渲染。
- 修复 R2 bucket 绑定
.get用垃圾数据填充 contentRange 的问题。contentRange 现在按预期为 undefined。 - 使用 JavaScript 支持的
ReadableStream时,现在可以将这些 stream 与new Response()一起使用。
- 修复了一个 bug:在确定 Durable Object 单键
put()应计费多少 write unit 时未计入键大小。当键足够大,使总写入大小超过下一个 4096 字节计费阈值时,未来的写入可能比过去的写入多计费一个 write unit。多键put()操作在确定可计费 write unit 时始终正确计入键大小。 CompressionStream和DecompressionStream的实现现已可用。
- 使用新
ReadableStream()构造函数构造的 ReadableStream 现已支持初始 pipeTo/pipeThrough。 - 设置
global_navigator兼容性标志后,可以使用navigator.userAgent属性检测代码是否在 Workers 环境中运行。 - 修复了新 URL 实现中设置
URLSearchParam值时的 bug。 - 使用 module 语法时,全局
addEventListener和 dispatchEvent API 现已可用。 URLPattern的实现现已可用。
TextDecoder类现在支持 WHATWG Encoding Standard 定义的完整文本编码范围。- 全局
fetch()和 durable objectfetch()在收到 WebSocket 响应但请求中没有 "Upgrade: websocket" 头时,现在会抛出 TypeError。 - Durable Objects 用户现在默认可以在账户中的所有对象中存储最多 50 GB 数据。与之前一样,如需更多存储空间,可以联系我们申请增加。
TextDecoder现在支持 Windows-1252 标签(即 ASCII):Encoding API Encodings - Web APIs | MDN ↗。
- WebSocket 消息发送错误地未遵守 Durable Object 输出门,如 I/O gate 博客文章 ↗ 所述。该 bug 现已修复,意味着 WebSocket 除非写入确实成功,否则绝不会在假设存储写入已成功的情况下发送消息。
- 修复了导致 WebSocket 连接到 Durable Objects 偶尔挂起的 bug,该问题发生在同时实现 Worker 和 Durable Object 的脚本以新代码重新部署时。
crypto.getRandomValues现在支持 BigInt64Array 和 BigUint64Array。- 标准 URL 实现的新版本现已可用。使用
url_standard功能标志启用符合规范的 URL API 实现。
- 无用户可见变更。
- 已将 V8 更新:9.7 → 9.8。
HTMLRewriter现在支持检查和修改结束标签,而不仅仅是开始标签。- 修复了 bug:Durable Objects 遭遇瞬时 CPU 过载时,会导致进行中的请求无法返回响应(从客户端看像是无限挂起),即使过载条件已清除。
workers_api_getters_setters_on_prototype配置标志修正了 Workers 将属性 getter 和 setter 附加到 API 对象的方式,使其可以被正确子类化。
- 现在可以使用
for和await对ReadableStream实例进行异步迭代。
- 将 Durable Object 存储中的最大 value 大小从 32 KiB 提高到 128 KiB。
AbortSignal.timeout(delay)返回一个在给定毫秒数后触发的AbortSignal。- 新
ReadableStream和新WritableStream构造函数的预览实现可在streams_enable_constructors功能标志后使用。 crypto.DigestStream是 crypto API 的非标准扩展,支持从流式数据生成哈希摘要。DigestStream本身是一个不保留写入数据的WritableStream;相反,当数据流结束时它会自动生成摘要哈希。crypto.subtle.digest()支持的所有哈希算法也受crypto.DigestStream支持。- 新增对
scheduler.wait()API 的早期支持,该 API 正在 WICG 标准化流程中 ↗,提供await-able 的setTimeout()替代方案。 - 修复了 Durable Objects 中
deleteAll包含超过 10000 个键时可能导致数据删除不完整和/或挂起的 bug。
- Streams 规范要求返回 promise 的方法不得抛出同步错误。作为使 Streams 实现更符合规范的努力的一部分,我们将多个同步抛出转换为异步 rejection。
- 重大 V8 更新:9.6 → 9.7。详见 V8 release v9.7 · V8 ↗。
- 收到过载异常的 Durable Object stub 将永久损坏,以匹配其他异常类型的行为。
- 修复了预览服务声称 Let's Encrypt 证书已过期的问题。
- 现已支持
structuredClone()↗。
AbortSignal对象新增了reason属性,指示取消原因。可以在触发或创建AbortSignal时指定原因。- 未处理的 rejection 警告将打印到 inspector 控制台。
- 升级至 V8 9.6。新增对 WebAssembly reference types 的支持。详见 V8 release v9.6 · V8 ↗。
- Streams:使用 BYOB reader 时,提供的 TypedArray 的
ArrayBuffer应按 Streams 规范被 detach。由于 Workers 此前未强制执行该规则,且改为符合规范可能破坏现有代码,因此引入了新的兼容性标志 streams_byob_reader_detaches_buffer ↗,将于 2021-11-10 默认启用。用户代码绝不应尝试重用已传入 BYOB reader 的read()方法的ArrayBuffer。较新添加的扩展方法readAtLeast()始终会 detachArrayBuffer,不受兼容性标志设置影响。
- 在
EventTarget.addEventListener()中新增对signal选项的支持,以响应AbortSignal移除事件监听器。 - 现已支持
unhandledrejection和rejectionhandled事件。 - 现已支持
ReadableStreamDefaultReader和ReadableStreamBYOBReader构造函数。 - 新增非标准
ReadableStreamBYOBReader方法.readAtLeast(size, buffer),可用于返回至少包含size字节的 buffer。buffer参数必须是ArrayBufferView。行为与.read()相同,除非至少读取size字节,仅在遇到 EOF 时返回更少。仍需要最后一次调用.readAtLeast()以获取done = true值。 - 兼容性标志
formdata_parser_supports_files、fetch_refuses_unknown_protocols和durable_object_fetch_requires_full_url已计划在 2021-11-03、2021-11-10 和 2021-11-10 分别默认启用。更多详情请参阅兼容性日期。
request.signal将始终返回AbortSignal。- Cloudflare Workers 与 Chrome DevTools 性能分析的集成现在能更准确地报告行号和经过的时间。此前,行号显示比实际代码晚一行,显示的时间成比例但比实际使用时间长得多。
- 升级至 v8 9.5。详见 V8 release v9.5 · V8 ↗。
AbortController和AbortSignal对象现已可用。- Web Platform
queueMicrotaskAPI 现已可用。 - 现在可以使用
new EventTarget()并创建自定义EventTarget子类。 addEventListener现在支持once选项,用于注册仅调用一次的事件处理程序。- 根据 HTML 规范,传入
addEventListener函数的监听器可以是函数或具有handleEvent成员函数的对象。此前 Workers 仅支持函数选项,现在两者均支持。 Event对象现在支持大多数标准方法和属性。- V8 从 9.3 更新至 9.4。
- 可以使用
crypto.randomUUID()方法生成新的随机 version 4 UUID。 - Durable Objects 现在在 colocation(colo)周围调度更加均匀。
- 无面向用户的变更。仅有 bug 修复和内部维护。
- 修复了 Durable Objects 一次读取超过 16MB 数据(例如大型
list()操作)时挂起的问题。 - 新增兼容性标志
html_rewriter_treats_esi_include_as_void_tag,使HTMLRewriter将<esi:include>和<esi:comment>视为 void 标签,即认为它们既没有结束标签也没有嵌套内容。要让 worker 采用新行为,必须使用 Wrangler v1.19.0 或更新版本,并在wrangler.toml中指定该标志。详见 Wrangler 兼容性标志说明 ↗。
- 性能和稳定性改进。
- Worker 现在可以在单次请求调用内向 Durable Objects 发起最多 1000 次子请求,高于之前的 50 次限制。
- Durable Objects 实现有重大变更,详情将在即将发布的博客文章中介绍。理论上,这些变更不应损害现有应用,只会使其更快。如果您观察到任何异常,请告知您的客户团队或在 Workers Discord ↗ 报告问题。
- Durable Object 构造函数现在可以发起 I/O,例如
fetch()调用。 - 新增 Durable Objects
state.blockConcurrencyWhile()API,用于在执行某些关键状态影响任务时延迟请求和其他事件的投递。例如,可用于在对象的构造函数中执行启动初始化。 - 在 Durable Objects 中,传入
storage.transaction()的回调现在可以返回值,该值将作为transaction()调用的返回值传播。
- 预览服务现在会在脚本使用
Response/Request.clone()但未读取其中一个克隆 body 时在 devtools 控制台打印警告。这种情况会迫使运行时将整个消息 body 缓冲在内存中,降低性能。在此查看示例 ↗。
- 修复了 bug:在同一事件类型上两次注册完全相同的事件监听器方法会抛出内部错误。
- 新增对
Headers、URLSearchParameters和FormData的.forEach()方法的支持。
- WebCrypto:实现了非标准 Ed25519 操作(算法 NODE-ED25519,曲线名称 NODE-ED25519)。Ed25519 实现与 NodeJS 的不同之处在于禁止 raw 导入/导出私钥,以与 ECDSA/ECDH 保持一致。
本周变更:
- 已将 V8 从 9.1 更新至 9.2。
wrangler tail现在可用于 Durable Objects。请注意,来自长生命周期 WebSocket 的日志在 WebSocket 关闭之前不可见。
本周变更:
- 启用 V8 Sparkplug 编译器。
- 在代码更新后正在完成现有请求的 Durable Objects 将与持久存储 API 断开连接,以维持给定 Durable Object 的持久存储始终只有单个实例可以访问的不变性。
本周变更:
- WebCrypto:我们现在支持 ECDSA/ECDH 公钥的 "raw" 导入/导出格式。
- 使用 modules 语法编写 Workers 时,
request.cf不再缺失。
本周变更:
- 改进了来自 WebCrypto API 的错误消息。
- 已将 V8 更新:9.0 → 9.1
更早版本中的变更:
- WebCrypto:实现 RSA、ECDSA 和 ECDH 的 JWK 导出。
- WebCrypto:新增 RSA-OAEP 支持。
- WebCrypto:实现了 HKDF。
- 修复 Durable Objects 中最近引入的时钟回跳问题。
WebCrypto.generateKey()在请求生成 RSA-PSS 算法密钥对时,会返回使用 RSASSA-PKCS1-v1_5 算法的密钥对。虽然密钥结构相同,但签名算法不同,因此使用该密钥生成的签名不会被正确的 RSA-PSS 实现接受,反之亦然。由于这会是相当明显的问题,但没有人向我们报告,我们猜测目前没有人将此功能用于 Workers。
本周变更:
- WebCrypto:实现了 AES 算法的
wrapKey()/unwrapKey()。 WebSocket.close()的参数现在是可选的,符合标准要求。
本周变更:
- 在 WebCrypto API 中,"AES-CTR" 加密算法的 encrypt 和 decrypt 操作现已支持。
- 对于 Durable Objects,CPU 时间限制现在在对象级别而非请求级别强制执行。每次新请求到达时,时间限制会"补满"至 500ms。(免费)Beta 期结束且 Durable Objects 正式发布后,我们将增加到 30 秒。
- 当 Durable Object 超过 CPU 时间限制时,整个对象将被丢弃并重新创建。此前,我们允许子请求继续使用同一对象,但这很危险,因为达到 CPU 时间限制可能使对象处于不一致状态。
- 随着更多 WebSocket 消息发送到长运行的 Durable Objects,会给予更多子请求配额,以避免长运行 Object 被特定 WebSocket 长时间保持打开后无法发起更多子请求的问题。
- 当 Durable Object 的代码更新,或因其 isolate 超过内存限制而重置时,所有指向该对象的 stub 将失效并必须重新创建。这与 CPU 时间超限或 stub 因随机网络错误断开连接时的行为一致。此行为很有用,因为应用现在可以假设发送到同一 stub 的两条消息(如果送达)将投递到完全相同的 live 实例。不关心此属性的应用应为每个请求重新创建 stub;这样做没有性能惩罚。
- 当 Durable Object 的 isolate 超过内存限制时,现在会向调用者抛出带有说明性消息的异常,而不是 "internal error"。
- 当 Durable Object 超过 CPU 时间限制时,现在会向调用者抛出带有说明性消息的异常,而不是 "internal error"。
wrangler tail现在以说明性消息报告 CPU 时间超限异常,而不是 "internal error"。
自 3/26 上次发布以来的变更:
- Cron Triggers 现在有 15 分钟 wall time 限制,除现有 CPU 时间限制外。(此前没有限制,因此将所有时间花在等待 I/O 的 cron trigger 可能永远挂起。)
- 我们的 WebCrypto 实现现在支持以 JWK 格式导入和导出 HMAC 和 AES 密钥。
- 我们的 WebCrypto 实现现在支持 CTR、CBC 和 KW 模式的 AES 密钥生成。AES-CTR encrypt/decrypt 和 AES-KW 密钥包装/解包支持将在后续版本推出。
- 修复了 bug:对零长度输入调用
crypto.subtle.encrypt()有时会抛出异常。 - 脚本上传错误现在会正确报告基于 module 的脚本,而不是显示为 ReferenceError。
- WebCrypto:ECDH 密钥派生。
- WebCrypto:支持 ECDH 密钥生成和导入。
- WebCrypto:支持 ECDSA 密钥生成。
- 修复了 bug:对零长度输入调用
crypto.subtle.encrypt()有时会抛出异常。 - 改进了 WebCrypto API 抛出的异常消息。
- module Workers 现在支持
waitUntil。在env之后传入名为ctx的额外参数,waitUntil是ctx上的方法。 passThroughOnException现在可在 module 处理程序的 ctx 参数下使用。- Durable Objects 可靠性改进。
- Durable Objects 持久存储 API 可靠性改进。
ScheduledEvent.cron现在设置为事件被调度的原始 cron 字符串。
本周变更:
- 代码更新时,到 Durable Objects 的现有 WebSocket 连接现在会被强制断开,以迫使客户端连接到运行新代码的实例。
本周新增:
- 当 Workers Runtime 因我们部署新版本或配置变更而重新加载时,我们现在在新 runtime 实例中预加载高流量 Workers,然后再切换流量。这确保用户不会因升级而观察到这些 Workers 的冷启动,也修复了我们此前因升级期间过载而看到的低频率虚假 503 错误。
(看起来过去几周没有发布 release notes,但没有新的用户可见变更需要报告。)
本周变更:
- 在仪表板的预览模式中,启动失败的 Worker 现在会返回 500 响应,而不是获得默认的 passthrough 行为,这使得更难注意到 Worker 正在失败。
- Durable Object 的 ID 现在在构造函数中提供给它。可以通过作为构造函数第一个参数提供的
state访问,例如state.id。
本周新增:
- V8 已从 8.8 更新至 8.9。
- 在
fetch()期间,如果目标服务器提交某些 HTTP 协议错误(例如返回无效/不可解析的 headers),我们现在会抛出描述问题的异常,而不是 "internal error"。
上周新增(忘记发布):
- 新增对 Durable Objects 中
waitUntil()的支持。它是传递给 Durable Object 类构造函数的状态对象上的方法。
过去一周新增:
- 修复了 bug:在预览服务中使用 devtools 时,带有 WebAssembly 模块的脚本会挂起。
本周变更:
- 实现了 File 和 Blob API,可在构造出站请求中的 FormData 时使用。遗憾的是,此时来自入站请求的 FormData 即使存在文件元数据仍会使用字符串,以避免破坏已部署的 Workers。我们将在未来找到修复方法。
本周变更:
- 无用户可见变更。
上一版本中的变更:
- 修复了 WebSocket "error" 事件的投递。
- 修复了罕见 bug:WritableStream 在仍有排队写入时可能被垃圾回收,导致这些写入丢失。
本周变更:
- 重大 V8 更新:8.7.220.29 -> 8.8.278.8
本周变更:
- 未公布的新功能。(敬请期待。)
- 强制执行并发子请求的新限制(见下文)。
- 稳定性改进。
并发子请求限制
从本版本起,我们对 Worker 可以同时发出的出站 HTTP 请求数量施加限制。对于每个入站请求,Worker 最多可以发起 6 个并发出站 fetch() 请求。
如果 Worker 的请求处理程序在不等待先前 fetch 完成的情况下尝试调用超过六次的 fetch()(代表单个入站请求),则第六次之后的 fetch 将被延迟,直到先前的 fetch 完成。Worker 仍然允许每个入站请求最多发起 50 次子请求,与之前一样;新限制仅针对可以同时执行的数量。
自动死锁避免
我们的实现会自动检测延迟 fetch 是否会导致 Worker 死锁,并通过取消最近最少使用的请求来防止死锁。例如,想象一个 Worker 启动 10 个请求并等待接收所有响应而不读取响应 body。fetch 在响应 body 完全消费(例如通过调用 response.text() 或 response.json(),或从 response.body 读取)之前不被视为完成。因此,在此场景中,前六个请求将运行并返回其响应对象,但剩余四个请求在前面的响应被消费之前不会启动。如果 Worker 未能实际读取前面的响应 body 并仍在等待最后四个请求,Workers Runtime 将自动取消前四个请求,以便剩余请求可以完成。如果 Worker 稍后返回尝试读取响应 body,将抛出异常。
大多数 Worker 不受影响
绝大多数 Worker 每个入站请求的出站请求少于六次。此类 Worker 完全不受此变更影响。
对于确实为单个入站请求并发发起超过六次出站请求的 Worker,绝大多数要么在每个响应返回后立即读取响应 body,要么根本不读取响应 body。无论哪种情况,这些 Worker 仍将按预期工作——尽管第六次之后的出站请求可能被延迟而稍慢。
极少数已部署的 Worker(总共约 20 个)并发发起超过 6 个请求,等待所有响应返回,然后返回读取响应 body。对于所有已知这样做的 Worker,我们已临时将您的 zone 纳入旧行为,以便您的 Worker 继续运行。但是,我们将逐一与客户沟通,请求您更新代码以主动读取请求 body,以便在新限制下正确工作。
我们为什么这样做?
Cloudflare 使用 HTTP/1.1 而非 HTTP/2 与源服务器通信。在 HTTP/1.1 下,每个并发请求需要单独的连接。因此,并发发起许多请求的 Worker 可能迫使创建过多到源服务器的连接。在某些情况下,这会导致源服务器或我们自己堆栈中的资源耗尽问题。
在调查此类 Worker 的用例时,我们查看的每个案例最终都是错误或不必要的。通常,开发者发起请求并接收响应,但只关心响应状态和 headers 而不关心 body。因此,他们丢弃响应对象而不读取 body,实质上泄漏了连接。在其他一些情况下,开发者只是意外编写了在循环中无意义地发起过多请求的代码。这两种情况在新行为下现在都不应造成问题。
我们基于 Chrome 对浏览器中网站强制执行相同限制这一事实,选择了 6 个并发连接的限制。
本周变更:
- Durable Objects 存储 API 现在支持按前缀列出键。
- 改进了错误消息:当单个请求执行超过 1000 次 KV 操作时,明确说明达到的是每请求限制而非全局限速。
wrangler dev预览现在应遵守非默认资源限制,例如 Workers Unbound Beta 用户的更长 CPU 限制。- 修复了 Worker 异常中的 off-by-one 行号。
- 在 Durable Object 的
fetch()方法中抛出的异常现在会隧道传输给其调用者。 - 修复了 bug:大型 Durable Object 响应 body 可能导致 Durable Object 变得无响应。
过去一周的变更:
ReadableStream.cancel()和ReadableStream.getReader().cancel()现在接受可选参数而非必需参数,以符合 Streams 规范。- 修复了错误:WASM 模块声明希望增长到超过 128MB 时。现在改为监控模块的实际内存使用量,超过 128MB 使用时抛出错误。
本周变更:
- 重大 V8 更新:8.6 -> 8.7
- 将单个事务中可更改的 Durable Objects 键的最大数量限制为 128。
我们上周进行了常规每周发布,但:
- 无用户可见变更。
本周变更:
- 支持即将推出功能的内部变更。
此外,2020-09-08 发布中似乎忘记发布的变更:
- V8 重大更新:8.5 -> 8.6
上周变更:
- 修复了回归问题,可能导致
HTMLRewriter.transform()抛出虚假的 "The parser has stopped." 错误。 - 已将 V8 从 8.4 升级至 8.5。
本周变更:
- 修复了 HTMLRewriter 中的回归:https://github.com/cloudflare/lol-html/issues/50 ↗
- 传递给
fetch()或new Request()的常用 HTTP 方法名现在不区分大小写,符合 Fetch API 规范要求。
上周变更(…忘记发布):
setTimeout/setInterval现在可以接受传递给回调的额外参数,符合规范要求。(很少有人使用此功能,因为使用 lambda 捕获通常容易得多。)
上上周变更(…也…忘记发布…我们真的需要为此编写一个 bot):
- HTMLRewriter 现在支持
:nth-child、:first-child、:nth-of-type和:first-of-type选择器。
本周变更:
- 实现了尚未公布的新功能的 API。
看起来我们忘记发布几周的 release notes 了。发布仍然每周照常进行,但"发布到社区"步骤自动化不足… 4/2 发布:
- 修复了内存限制执行中长 GC 暂停的来源。
4/9 发布:
- 无公开可见变更。
4/16 发布:
- 在预览中,当尝试构造 body 类型为
FormData但Content-Type头被覆盖的Request或Response时,我们现在会记录警告。此类 body 接收方将无法解析。
本周新增:
- 使用 Cache API 时可能抛出的某些 "internal errors" 现在以人类友好的错误消息报告。例如,
caches.default.match("not a URL")现在抛出 TypeError。
过去两周新增:
- 修复了预览服务中的 bug:CPU 时间限制器对新启动 worker 处理的前几个请求过于宽松。同样的 bug 实际上也存在于生产环境中,但我们在那里修复时更加谨慎,因为可能会破坏 live 站点。如果您发现 worker 现在在预览中超过 CPU 时间限制,那么它在生产中也可能会超过时间限制,只是由于前几个请求的限制过于宽松而看起来正常工作。此类 Worker 最终也会在生产中失败(并且一直如此),因此最好在部署前在预览中修复问题。
- 重大 V8 更新:8.0 -> 8.1
- 小幅 bug 修复。
过去几周的变更:
- 修复了 bug:如果同一账户内两个不同名称的脚本内容相同且部署到同一 zone,它们会被视为"同一个 Worker",意味着它们共享同一 isolate 和全局变量。这仅适用于同一 zone 上的 Workers,因此不是安全威胁,但造成了困惑。现在,两个不同名称的 Worker 脚本即使内容相同也永远不会被视为同一个 Worker。
- 性能和稳定性改进。
距离上次发布 release notes 已有一段时间,部分由于假期。以下是过去一个月的新增内容:
- 性能和稳定性改进。
- 消除了处理 HTTP/2 突发流量时
daemonDown错误的罕见来源。 - 已将 V8 更新:7.9 -> 8.0。
本周新增:
- 我们现在更频繁地向 V8 inspector 报告异常时传递正确的行号和列号。仍有一些情况下报告的行号和列号会错误。
- 修复了
daemonDown(1105) 错误的重要来源。
过去几周的 Runtime release notes:
- 将每请求
Cache.put()总限制提高至 5GiB。 - 将单个
Cache.put()限制提高至 5GiB 或 zone 正常缓存限制中的较小值。 - 新增解释 AES 解密失败的有用错误消息。
- 一些过载错误错误地报告为 daemonDown (1105) 错误。已更改为 exceededCpu (1102) 错误,更好地描述其原因。
- 更多 "internal errors" 转换为有用的面向用户的错误。
- 稳定性改进和 bug 修复。