最近系统需要做一个日志平台,对所有接入的系统进行日志的统计分析,因为之前用的是kafka来实现各业务系统日志接入日志平台的,所以想到了直接使用kafka官方本身提供的一个实时计算框架kafka stream。
kafka stream的时间窗口有两个重要的属性:窗口大小和步长(移动间隔),滚动窗口Tumbling Time Window:步长等于窗口大小,滚动窗口是没有记录的重叠;跳跃窗口Hopping Time Window:步长不等于窗口大小。
我们的需求是要求预警每天从0点到24点时间段内发生操作或查询次数过多的记录,之前我用的是滚动窗口,窗口大小为一天,不过我看了kafka的默认实现,窗口设置在.windowedBy(TimeWindows.of(Duration.ofDays(1))),TimeWindows对象里面主要的方法就是public Map<Long, TimeWindow> windowsFor(final long timestamp) {},根据记录的时间戳来判断是属于哪个窗口,默认代码为
@Override
public Map<Long, TimeWindow> windowsFor(final long timestamp) {
long windowStart = (Math.max(0, timestamp - sizeMs + advanceMs) / advanceMs) * advanceMs;
final Map<Long, TimeWindow> windows = new LinkedHashMap<>();
while (windowStart <= timestamp) {
final TimeWindow window = new TimeWindow(windowStart, windowStart + sizeMs);
windows.put(windowStart, window);
windowStart += advanceMs;
}
return windows;
}
该实现的窗口时间段是从8点到第二天的8点为一天,而不是需求要求的0点到24点,于是我重新实现了一个类OffsetTimeWindows
@Override
public Map<Long, TimeWindow> windowsFor(final long timestamp) {
long windowStart = timestamp - (timestamp + offset) % sizeMs; //取得当前时间戳那天0点的时间戳
final Map<Long, TimeWindow> windows = new LinkedHashMap<>();
while (windowStart <= timestamp) {
final TimeWindow window = new TimeWindow(windowStart, windowStart + sizeMs);
windows.put(windowStart, window);
windowStart += advanceMs;
}
return windows;
}
其中增加了一个offset的参数,可以在初始化这个类的时候进行赋值,以达到自定义任意时间段的效果,我是需要0点,所以该offset我设置为28800000,经过测试,能够完美实现该效果。
在实现该需求的过程中,我发现flink的客户端有直接提供设置偏移量的窗口类TumblingEventTimeWindows,而kafka本身是没有实现的,目前看起来flink是功能更完备一些的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。