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

时间:2018-05-09 03:26:29

标签: pipelinedb

我的应用程序生成包含多个应用程序指标的旋转日志文件日志文件每分钟旋转一次,但每个文件仍然相对较大(超过30MB,有100ks行)

我想将日志提供给PipelineDB(在同一台机器上运行),Countiuous View可以为我创建完全符合指标的聚合。

我可以使用stdin中的副本轻松地将日志发送到PipelineDB,这非常有效。

但是,在复制日志文件期间,机器可能偶尔意外断电(例如由于电力不足)。这意味着一旦重新上线,就会有多少文件被插入PipelineDB中。

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

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

尽管如此,这个问题还有其他解决办法吗?

1 个答案:

答案 0 :(得分:1)

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

话虽这么说,你可以在这里使用一些值得思考的方法。

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

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