最近写了一个基于drools的实时监控告警程序,思路非常简单,大体是flink读取kafka中的性能数据,然后数据和drools规则引擎交互进行告警判断,最后输出。
drools规则文件保存了监控规则,由于规则众多,大于有30多w条不同的监控规则。我根据hostip进行了分组,相同hostip的规则在同一个drl文件中。每次和drools交互时都需要创建kieSession,而kieSession是根据KieContainer创建的,KieContainer第一次创建比较耗时,我这边测的在规则文件较小的情况下第一次创建需要3s,后续的创建需要200ms左右。所以我按照hostip去创建KieContainer,这样只需要第一次创建比较耗时。
但是我的程序还是出现问题了。一次checkpoint需要4分钟,但是checkpoint时间并不长,大部分时间在对齐上。也出现了背压的情况,感觉KieContainer的创建还是个瓶颈。
和drools交互时,每条数据交互需要200ms。但是每秒有几百条数据甚至更多,那这样数据就一直处理不完了。
尝试优化:
维护一个cache,用于保存KieSession,当数据到达时先去cache中根据hostip获取KieSession,如果没有则新建。新的hostip比较多,一秒内还是有很多需要新创建的KieSession。
但是感觉效果并不明显,还是出现背压。
感觉flink + drools不太合适啊,除非KieSession能够共用。
感觉drools还有一个问题,就是规则维护比较麻烦,如果规则以规则文件的方式存在,当规则文件数超多时就很头疼了,成千上万个文件