Azure Digital Twin Query API 分页调用返回重复结果问题
问题根因
重复记录问题的核心原因是分页查询未指定稳定的全局排序规则,属于Azure Digital Twins查询分页机制的固有特性,和你token转义、请求体传参格式无关。
Azure Digital Twins底层为分布式存储架构,执行select * from digitaltwins这类不带ORDER BY子句的查询时,服务端不会对全量结果做全局固定排序。分页拉取时,不同存储分片的返回顺序可能出现偏移:当max-items-per-page设置值较小、需要多次分页拉取时,顺序偏移会直接导致部分记录被重复归入后续分页结果,极端场景下还会出现记录漏返回。你把max-items-per-page设为100(大于总结果数22)时,服务端单次请求即可返回全量结果,不需要跨分片多次扫描,自然不会出现重复。
你贴出的示例continuation token中,_pn字段标记的是分片扫描的偏移位置,在无全局固定排序的前提下,这个偏移对应的记录位置不是恒定的,这就是重复记录的直接来源。
解决方案
- 所有需要分页的查询语句,必须加上基于唯一键的
ORDER BY子句,最稳妥的排序键是孪生体全局唯一标识$dtId,将初始查询修改为:
SELECT * FROM digitaltwins ORDER BY $dtId ASC
加上固定全局排序后,服务端分页会严格按照排序键的固定位置返回结果,不会出现跨页顺序偏移,重复记录问题会直接消失。
- 分页请求注意事项:携带continuation token发起后续请求时,不要在请求体重复传入
query字段,也不要修改max-items-per-page请求头的取值,保持和首次发起查询时的参数完全一致,避免服务端重新计算分页位置导致异常。 - 临时兜底方案:如果暂时不调整查询语句,可以在客户端拿到全量结果后,以
$dtId为唯一键做去重,但该方案无法解决无排序导致的记录漏取问题,仅适合临时使用,长期场景必须加固定排序。
验证方式
保持max-items-per-page=3的设置,仅给查询语句加上ORDER BY $dtId后重新执行分页拉取,最终拿到的22条记录会完全无重复、无遗漏,和单页拉取100条的结果完全一致。
内容的提问来源于stack exchange,提问作者daz-fuller
相关产品推荐
相关产品推荐

