幂等流或使用 PipelineDB 防止重复行

Idempotent streams or preventing duplicate rows using PipelineDB

我的应用程序生成包含多个应用程序指标的循环日志文件。日志文件每分钟轮换一次,但每个文件还是比较大(超过30MB,100ks行)

我想将日志输入 PipelineDB(运行 在同一台机器上),Countiuous View 可以为我创建我需要的指标聚合。

我可以使用来自标准输入的副本轻松地将日志发送到 PipelineDB,效果很好。

但是,在复制日志文件的过程中,机器可能偶尔会意外关机(例如由于电力不足)。这意味着一旦重新联机,就不确定有多少文件已插入到 PipelineDB 中。

在这种情况下,我如何确保日志中的每一行都被恰好插入一次? (获得完整准确的聚合非常重要)

请注意,日志文件中的每一行都有一个唯一标识符(由我的应用程序创建的序列号),但我在文档中找不到用于在流中定义唯一字段的选项。我假设 PipelineDB 的设计并不意味着处理流行中的唯一字段

尽管如此,这个问题是否有其他解决方案?

流式(无限行)上下文中的恰好一次语义是一个非常复杂的问题。大多数大型 PipelineDB 部署在 PipelineDB 之前使用某种消息总线基础设施(例如 Kafka)来实现交付语义和可靠性,因为这不是 PipelineDB 的核心重点。

话虽如此,您可以在此处使用一些值得考虑的方法。

首先,您可以在 PipelineDB 中维护一个常规 table 来跟踪每个日志文件和它已成功写入 PipelineDB 的行号。当开始传送新的日志文件时,请根据此 table 检查它以确定从哪个行号开始。

其次,您可以通过日志文件(通过在分组中包含路径或其他内容)分隔聚合,并在发送之前简单地 DELETE 该日志文件的任何现有行。然后使用 combine 在读取时聚合所有日志文件,可能使用 VIEW.