pipelinedb - 幂等流或使用 PipelineDB 防止重复行
问题描述
我的应用程序生成包含多个应用程序指标的旋转日志文件。日志文件每分钟轮换一次,但每个文件还是比较大的(超过30MB,有100ks行)
我想将日志提供给 PipelineDB(在同一台机器上运行),Countiuous View 可以为我准确地创建我需要的指标聚合。
我可以使用标准输入的副本轻松地将日志发送到 PipelineDB,效果很好。
但是,在复制日志文件期间,机器可能偶尔会意外断电(例如,由于电力不足)。这意味着一旦重新上线,不确定有多少文件已插入 PipelineDB。
在这种情况下,如何确保日志中的每一行都只插入一次?(获得完整和准确的聚合非常重要)
请注意,日志文件中的每一行都有一个唯一标识符(由我的应用程序创建的序列号),但我在文档中找不到在流中定义唯一字段的选项。我假设 PipelineDB 的设计不是为了处理流行中的唯一字段
尽管如此,有没有其他解决方案可以解决这个问题?
解决方案
流式(无限行)上下文中的恰好一次语义是一个非常复杂的问题。大多数大型 PipelineDB 部署在 PipelineDB 前面使用某种消息总线基础设施(例如 Kafka)来实现交付语义和可靠性,因为这不是 PipelineDB 的核心重点。
话虽如此,您可以在这里使用一些值得考虑的方法。
首先,您可以在 PipelineDB 中维护一个常规表,用于跟踪每个日志文件及其成功写入 PipelineDB 的行号。开始发送新的日志文件时,对照此表检查它以确定从哪个行号开始。
其次,您可以DELETE
在发送之前通过日志文件(通过在分组中包含路径或其他内容)以及该日志文件的任何现有行来分离您的聚合。然后使用combine在读取时聚合所有日志文件,可能使用VIEW
.
推荐阅读
- docker - Docker 解决方案,用于在多个容器之间分发文件内容并将输出合并到一个文件中
- azure-sql-database - Azure SQL 数据库的 SSMS 索引提示
- r - 绘制一段时间内的数据趋势
- react-native - 无法在 React Native Share 中分享产品图片
- r - bigrquery - 错误:没有匹配的运算符签名 - 对于参数类型:DATE、FLOAT64
- c - free() 调用中的 _snwprintf_s 堆损坏错误
- mysql - 比较两个表后如何输出匹配?
- python - 如何将外部对象附加到系列索引
- reactjs - 如何在反应js中调用从一个组件到另一个组件的方法(在新选项卡中)
- android - 响应 Delphi 中的媒体按钮