事件中心检查点在服务器重新启动之前不获取事件

Posted

技术标签:

【中文标题】事件中心检查点在服务器重新启动之前不获取事件【英文标题】:Event Hub Checkpoint Not Fetching Events Until Server Restart 【发布时间】:2021-10-05 01:53:20 【问题描述】:

我的异步消费者从事件中心获取数据。我在每次事件处理后更新检查点。如果在处理事件时引发任何错误/异常,则不更新检查点。这样我们以后可以得到相同的事件并且我们不会跳过那些事件。但是,在我们重新启动服务器之前,我们不会收到这些处理失败的事件。

一旦服务器重新启动,我们将获得新事件以及未设置检查点的事件。

有什么方法可以在不重启的情况下获取它们(没有检查点的事件)?

而且我对检查点的行为也有点困惑。假设

Event 1 is processed. Checkpoint.
Event 2 throws an exception.
Event 3 throws an exception.
Event 4 is processed. Checkpoint.

现在,每当服务器重新启动时,检查点都会超过事件 2 和 3,因此它们将永远不会被重新处理。但是,为什么在事件 4 更新检查点时服务器重新启动时它们又回来了,它应该从事件 4 获取对吗?

【问题讨论】:

你能告诉我们每个事件在哪个分区吗?事件中心中的所有活动都基于每个分区发生。您正在检查事件 1 和 4。这可能会创建一个更新的检查点,或者它可能作为两个单独的检查点存在,具体取决于所涉及的分区。 【参考方案1】:

简短的回答是“不是来自同一个消费者。”

Event Hubs 是一个可以以只进方式读取的事件流;您不能在原地倒回流并重新读取事件。要倒带,您必须创建一个新链接并指定流中较早的起始位置。

Event Hubs SDK 的使用者客户端读取事件并将它们发送到您的代码进行处理。每个读取的事件都会发出一次 - 处理代码有责任判断如何执行此操作。如果您的处理以您认为暂时的方式失败,则应确保对该事件的重试作为处理逻辑的一部分进行,对于您希望稍后重新访问的事件的任何形式的死信也是如此。

【讨论】:

感谢您的回复,杰西。因此,在我们重新启动服务器之前,我们不能从同一个消费者那里执行此操作。但是由于 Event Hub SDK 中没有死信队列的概念,您能否向我建议除数据库之外的任何中间重试流程机制(用于保存失败的事件数据)。 您的核心问题的答案保持不变;您不能在消费者中倒带流。也就是说,根据事件所属的分区以及这些分区的所有权是否在处理器之间迁移,您可以根据更新的上下文再次看到这些事件。

以上是关于事件中心检查点在服务器重新启动之前不获取事件的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py - 重新启动命令错误 - RuntimeError:事件循环已关闭

重新启动 Azure 流分析作业而不丢失数据

mysql开启定时调度任务执行

在服务器进程完成重新启动之前重新加载 gulp-livereload

服务器重新启动socket.io socketio-jwt后Angular 6验证客户端

socket.io 在 x 秒/第一次尝试获取响应失败后停止重新发出事件