@ cratestack/ link- batch
A 类 屁话- CrateStack 的自动批量排程器
生成类型Script RPC客户端(transport rpc 计划),作为
RpcLink
(单位:千美元)问题182而不是一个 fetch
覆盖——所以它由 @cratestack/link-logger,重试链接,或重新认证链接
而不是打他们.
反应原生相容性证据在
docs/react-native-compatibility.md。 。 。 .
在同一勾选符中发出的多次无序呼叫会崩溃成单个 POST /rpc/batch 请求
而不是发射一个 POST /rpc/{op_id} 每一个.
使用量
import { createBatchLink } from "@cratestack/link-batch";
import { CratestackRpcRuntime } from "./generated/runtime"; // your project's generated client
const runtime = new CratestackRpcRuntime("https://api.example.com", {
links: [createBatchLink()],
});
const client = new MyGeneratedClient(runtime);
// These three calls, if issued in the same tick, become ONE /rpc/batch request:
const [a, b, c] = await Promise.all([
client.widgets.get(1),
client.widgets.get(2),
client.widgets.get(3),
]);
断接语义
- 窗口: 默认为
queueMicrotask——在同一勾点中同步发来呼叫(如:. 内部Promise.all)崩溃. 过windowMs将窗口对开. - 分区 (固定在 273号; 版本
ưμ㼯A
按运输信封分列的分区——标题(不包括)
Idempotency-Key,该附件载有 (b) 按框架而不是按要求),fetch参考、编码参考和已解决的批次 URL - 每一个分区都是作为自己的POST /rpc/batch。呼吁共享一个信封 绝大多数常见的情况,仍然完全变成一个请求;没有这样的电话(例如两个) 不同Authorization标题)各保留自己的,在单独的请求中,而不是一个 默而覆于彼所出. - 总标题: 通过
headers改为createBatchLink({ headers })以声明信头 每一个合成/rpc/batch请求载, 合并 结束 每个分区本身的——a 同名的每个呼叫标题被这个值所压倒,而不是相反. 使用这个 服务级头(如 API 密钥) 而不是 per- tenant auth, 应从 驱动分区的每个呼叫头. maxBatchSize已执行 每个分区,而不是全球横冲直撞——一个 将超大小的分隔块划入多个并行请求中;它从不借用一个 不同的分区.- 编剧: 只呼叫共享明确
idempotencyKey崩溃为一个请求框架 默认情况下——这已经是呼叫者自己的信号,即呼叫是安全的重复. 电话: 没有一能键从不自动折叠,因为服务器没有自行脱落,而且 悄悄地合并两个文本相同但无标记的变异是不安全的。 通过自定义dedupe完全基于值的崩溃,或() => null以禁用调试并只禁用批量。 编剧 运行 在内部 一个分区——它从不崩溃 跨越两个不同的信封. - 关联: 通过匹配每个响应框的结果后扇出
id数组 位置——服务器的/rpc/batch合同已签发担保令(见docs/design/rpc-transport.md§3.2),但基于id的匹配严格来说更坚固并具有镜像功能 repo自己的Rust客户端批发器(examples/rpc-batch-debounce) (中文(简体) ). - 失败隔离: 失败的分区( 网络错误, 非 OK 响应) 只拒绝 已排队的呼叫者 那个 分区——它绝不影响同时飞行的分区.
已知的限制
- 中止个人通话
AbortSignal只有在批次尚未发送时才取消—— 它不会取消飞行/rpc/batch请求. - (fixed in #273),这里保存着任何读取旧版本的道克的人 在273号之前
已合成
/rpc/batch请求重新使用 第一个 队列调用headers编号 :fetchFn编号 :codec页:1 整个冲浪——同一窗口内后来的呼叫中,每个呼叫的自定义头被悄悄地放下 从总请求中选择,而不是应用。 这就是为什么现在存在分割.