我在应用程序中使用Cosmos Change Feed Processor使用Java来消费Cosmos Change Feed Cosmos NoSQl DB容器

  1. 根据文档,如果使用Change feed processor方法,那么在我们开始消费变更提要时,在该点之前的所有插入/更新都将作为单个快照交付.

  2. 由于我正在进行的过程是在非生产环境中进行的(在Prod中进行之前进行测试),因此self 的更换饲料消耗开始以来,容器没有大量插入/更新.

从以上2点,我们可以得出结论,变更提要处理器(运行和消费更新时)返回的估计延迟不应比容器中文档总数高出多倍

然而,我认为估计的滞后约为1.3亿条,因为我的容器中只有约700万条记录.

我的容器只有1个物理分区(因此只有1个Change feed处理器正在运行),下面是我用来计算估计延迟的代码.

AtomicInteger totalLag = new AtomicInteger();
List<ChangeFeedProcessorState> currentState = changeFeedProcessor.getCurrentState().block();
if (CollectionUtils.isEmpty(currentState)) {
    System.out.println("Unexpected METRICS :: STATES is empty");
    continue;
}
for (ChangeFeedProcessorState changeFeedProcessorState : currentState) {
    totalLag.addAndGet(changeFeedProcessorState.getEstimatedLag());
}
System.out.println(totalLag.get());

有人能提供他们对此的专业知识吗

推荐答案

TL;DR如果您阅读文档字面意思(不多!),估计滞后绝对不是"剩余待处理的文档数量"与你想让它说什么."估计者"一词显然还旨在传达这样一个事实:这不是也不可能是一个精确的指标.


滞后是当前判断点"位置"和最近写入的位置标识符的函数.该位置也(大约)用于延续 token .每次写入或批次写入都会向前推进(甚至更新).您不能依赖或假设没有差距等(想想复制、回滚工作等任何原因)

换句话说,如果您对文档进行插入并更新20次,则计数将向前移动21或更多.如果您在单个逻辑分区中更新2个文档,我认为这可能只会将其移动一个.

不过,还有很多其他因素-例如,当物理分区分裂时,位置保持不变,但一半数据流向一侧,另一半数据流向另一侧.如果您try 进行数学计算,您会认为两个"新分区"要做的工作量是原始分区的"滞后"值的两倍.


除了对真实数据进行实际穿越(由于相关RU消耗,这会产生很多副作用)之外,根本没有办法知道文档方面的实际差距是多少.

幸运的是,对于大多数现实世界的 case 来说,这也并不真正重要;对于附加到Changefeed的任何内容,可以达到的吞吐量(以及可以实现的一致性)存在自然变化- IME很少有有趣的系统具有足够稳定和一致的每个文档的处理成本.

最好的做法是将其放在图表上,并在比较合理相关的情况时将其用作大致指标(相同数量的文档,具有相同的处理成本,具有相同的处理能力,处理来自提要的项目)

Java相关问答推荐

更新我们的一个文物后出现了严重的符号引用错误

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

CriteriaQuery with max

Spring boot:Bean和动态扩展器

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

JDK22执行repackage of goal org. springframework. boot:spring—boot—maven—plugin:3.2.3:repackage failed:unsupported class file major version 66—>

使用联接和分页的SpringBoot Spring数据JPA

条件加载@ManyToMany JPA

为什么JAVA&S清洁器使用链表而不是并发HashSet?

如何使用带有谓词参数的方法,而不使用lambda表达式

Cordova Android Gradle内部版本组件不兼容

无法使用Freemarker从XML中读取重复的标记值

X=x*0.90;产生有损转换误差.X*=0.90;不是.为什么?

无法使用Java PreparedStatement在SQLite中的日期之间获取结果

协同 routine 似乎并不比JVM线程占用更少的资源

在Java中使用StorageReference将数据从Firebase存储添加到数组列表

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

Maven创建带有特定类的Spring Boot jar和普通jar

ExecutorService:如果我向Executor提交了太多任务,会发生什么?