Kafka将单个日志事件行聚合为一个组合日志事件



我使用Kafka来处理日志事件。我有Kafka Connect和Kafka Streams的基本知识,用于简单的连接器和流转换。

现在我有了一个日志文件,结构如下:
timestamp event_id event

日志事件有多个日志行,这些日志行由event_id(例如邮件日志)连接

的例子:

1234 1 START
1235 1 INFO1
1236 1 INFO2
1237 1 END

一般来说有多个事件:

的例子:

1234 1 START
1234 2 START
1235 1 INFO1
1236 1 INFO2
1236 2 INFO3
1237 1 END
1237 2 END

时间窗口(从开始到结束)最长可达5分钟。

因此我想要一个像

这样的主题
event_id combined_log

的例子:

1 START,INFO1,INFO2,END
2 START,INFO2,END

实现这一目标的正确工具是什么?我试图解决它与Kafka流,但我可以弄清楚如何…

在您的用例中,您实际上是基于消息有效负载重构会话或事务。目前还没有内置的、现成的对这些功能的支持。然而,你可以使用Kafka的Streams API的Processor API部分来实现这个功能。您可以编写自定义处理器,使用状态存储来跟踪给定键的会话/事务何时开始、添加和结束。

邮件列表中的一些用户已经在IIRC中这样做了,尽管我不知道有什么现成的代码示例可以告诉你。

您需要注意的是正确处理无序数据。在上面的示例中,您以适当的顺序列出了所有输入数据:

1234 1 START
1234 2 START
1235 1 INFO1
1236 1 INFO2
1236 2 INFO3
1237 1 END
1237 2 END

在实践中,消息/记录可能会乱序到达,就像这样(为了简化示例,我只显示键为1的消息):

1234 1 START
1237 1 END
1236 1 INFO2
1235 1 INFO1

即使发生这种情况,我明白,在您的用例中,您仍然希望将此数据解释为:START -> INFO1 -> INFO2 -> END而不是START -> END(忽略/删除INFO1INFO2 =数据丢失)或START -> END -> INFO2 -> INFO1(不正确的顺序,可能也违反了您的语义约束)。

最新更新