Cosmos DB中CancellationToken能否触发服务端计算终止并减少RU消耗?
Cosmos DB取消请求能否减少RU消耗?
问题背景
Cosmos DB .NET客户端的诸多方法(如FeedIterator.ReadAsync())支持传入CancellationToken参数以取消请求。从源码可见,该令牌会在代码多处被校验,最终也会传递至Cosmos DB的HTTP端点。当客户端在等待HTTP端点返回数据阶段(如在GateStoreClient.InvokeClientAsync()中)取消CancellationToken时,HTTP请求会被取消。这是否会使Cosmos DB提前终止计算并减少RU消耗(例如原本需运行数分钟,却在数毫秒后停止)?
回答
- 确实会提前终止计算并减少RU消耗,但效果取决于取消时机:
- 计算阶段取消:如果请求还处于Cosmos DB的计算环节(比如正在执行复杂查询、扫描大量文档),此时客户端触发取消,服务端会立刻检测到HTTP连接断开,终止正在进行的计算流程。未执行的计算部分不会产生RU消耗,比如原本要运行数分钟的查询,数毫秒后取消的话,只会收取这数毫秒内实际计算对应的RU。
- 结果返回阶段取消:如果Cosmos DB已经完成计算,正处于结果返回阶段,此时取消请求的话,已经产生的RU不会退回——因为RU是按实际完成的计算量计费,而非请求时长。
- RU计费逻辑:Cosmos DB的RU是根据实际执行的操作(文档扫描、索引查找、计算步骤等)统计的,不是按请求发起后的时长收费。只要计算被提前终止,未执行的操作就不会被计费。
内容的提问来源于stack exchange,提问作者Mo B.
相关产品推荐
相关产品推荐

