直至正文
豫言包府
← 众包

豫言操作系统持久独占 0.1.0

豫言 · 库

在持久对象内开启并发独占区:区内可等待外部输入输出,其他事件排队等候。

持久独占之约 0.1.0

此包使客于当前持久对象(Durable Object)中开一并发独占之区:区内客可候外物之出入(呼他服务、读上游、行较长之算),而其间投于此对象之他事(HTTP 请、告警、套接字之信)皆排队以候,不与区内之读写交错。其当平台之 blockConcurrencyWhile;典型之用,乃“读、改、外呼、写”须整体串行之请,如同一站同一时惟理一动态之请。

模

今编译入口犹为 _start,故独占之区借事重入以成(与[持久事务](../持久事务/规范.文言.md)相对):客于持久对象之事中调 执行持久独占 操作名 参数,宿主止投他事于此对象,复入于客,事类为 durable-block(客循[网页入站之约](../网页入站/规范.文言.md)之 读取入站事件种类 辨之);独占区之入口以 读取持久独占名、读取持久独占参数 取本次之操作名与参,事毕则调 完成持久独占 结果 定其果;宿主待入口终,复投他事,而以其果为 执行持久独占 之返。此重入乃适配之术,他日可换类型化回调,客所见之义不易。

义

操作名为一至一百二十八字节之文,由客所约,以于独占区入口中择所为之事;参与果皆为有效 JSON 文,各不逾八 MiB,宿主验之(JSON 非法则调用败)。独占区之入口不见外层之 HTTP 请(durable-block 非 HTTP 之事,不得读请或设应),外层欲授之请之资(法、径、体、头等)当纳于参之 JSON,果再由外层据以造应。完成持久独占 每区必且惟一成功。

区内客可读写久仓(含[持久事务](../持久事务/规范.文言.md)之直读写术)、启事务、读写[持久告警](../持久告警/规范.文言.md)、候任意外物之出入;不得复开独占之区(独占区内不可再启动独占区)。诸区依次而行,不相叠;区行之际所至之他事,区毕乃投。区行之际此对象之吞吐尽为所占,故区内耗时愈短愈善。

区内之败——入口抛未捕之异、不曾 完成持久独占、果非有效 JSON 或逾八 MiB、逾事时之限——不传于平台:宿主以败为值授外层,执行持久独占 抛可以「尝试运行」捕之豫言异,辞以 持久独占失败: 起而存其因;对象不被重置。此乃有意之设:平台原生 blockConcurrencyWhile 之回调一抛错,则重置整个持久对象(弃内存之态、使方行之请败,本地 workerd 已验),而客中独占区之败乃常见之业务情形。入口自抛而未捕之豫言异,出宿主之界则显为 RuntimeError: illegal cast,宿主于辞后附其说;欲告外层以确因,入口当自以「尝试运行」捕之,而书其因于 完成持久独占 之果。

平台于独占区回调逾三十秒则重置对象(本地 workerd 已验:逾三十秒则对象被重置,请败)。欲令逾时显为可捕之异而非重置,宿主定 durable-block 事之默认墙钟时限为二十五秒,可由构建产物之 执行配置.json 调之而不得逾三十秒;时限惟于豫言呼宿主之能时察之,单次外呼自耗时过长,仍或触平台三十秒之线,客当为外呼设更短之时限。

术

执行持久独占 操作名 参数:返果 JSON 文。读取持久独占名:无参,返操作名。读取持久独占参数:无参,返与调用者所授一致之参文。完成持久独占 结果:定其果,返有。

败之情形

| 情形 | 类 | | --- | --- | | 操作名非一至一百二十八字节;参非有效 JSON 或逾八 MiB | 违约:执行持久独占 抛可捕之异,辞曰 持久独占失败:… | | 入口败、无果、逾时 | 抛可捕之异,辞曰 持久独占失败:…,对象不重置 | | 完成持久独占 之果非有效 JSON、逾八 MiB 或重复调用 | 于独占区内由 完成持久独占 抛可捕之异(持久独占结果无效:…),入口捕之可另给其果 | | 于非持久对象之事、事务入口内、独占区内调 执行持久独占;于独占区外调 读取持久独占名、读取持久独占参数、完成持久独占 | 违约:抛可捕之豫言异 | | 所换文逾宿主之限(十六 MiB)、平台之故、独占区逾平台三十秒 | 平台或宿主之故:止当前事(逾三十秒则对象被重置),豫言不可捕 |

跨宿主之一致

诸实现须守:区内不与他事交错、区内所至之事区后乃投;区内之败以可捕之异告之而不重置对象;不可嵌套;参与果依 JSON 文原样而传(果不必与 完成持久独占 所授文字节相同,然 JSON 意义相等);上述诸限与败类。

一致性样例

对象中键 n 初为 0。五并发之请各 执行持久独占 "counter" 参,入口读 n、候外物三十毫秒、写回 n+1 而返新值,则五果恰为一至五之一排列,终 n 为 5,外候之区间两两不叠;同此读、候、写若不入独占区,五并发之请所得皆为 1、终 n 为 1(更新遗失)。独占区行中所至之 durable-fetch 请,区毕乃理。执行持久独占 "fail" "{}" 而入口未捕其异,则抛以 持久独占失败: 起之异,其后对象如常而实例不易。执行持久独占 "" "{}"、执行持久独占 "x" "不是JSON" 抛异。区内复 执行持久独占 抛 独占区内不可再启动独占区。

界

此包不供带优先之队、逾时自弃之独占区、跨对象之分布式锁,亦不携外层 HTTP 请入区。惟用于获授之当前持久对象,对象之名与授由宿主及部署之配置定之。独占区不易平台于存储读写之输入门规则,惟于区内更挡他事之投。

所赖

观包之制

上传之记

今修订:1 ·

  1. 修订 1
    取 ZIP

包之层级

父:豫言操作系统接口

无子包。