背景
技术调研阶段,我们对Drools进行了简单的性能测试,模拟我们数据转发的场景,直接内存中构建msg然后触发,只是测试了drools的规则匹配的能力。现在我们想全流程测试下,具体流程如下:

分为两种方式,第一种方式在drools脚本中,将匹配后的结果,直接发送到kafka中。第二种方式规则匹配后将结果先发送到EventBus,然后再由单独的线程进行订阅发送到Kafka。
规则示例
package drools.example;
import com.cuiot.dmp.ruleengine.dto.Message;
template "forward"
rule "f"
when
$msg : Message(orgId =='@{orgId}' && productKey=='@{productKey}')
&& eval(hasProductLabels('@{productLabels}',$msg.getProductLabels())>0)
then
$msg.publish();
end
匹配的性能
规则总数1000条,能匹配成功的规则100条。耗时约:0.1-0.5ms。

资源消耗
两种方式CPU消耗如下。方式一减少了一个环节,CPU消耗也相应的降低了不少。内存占用都不多,GC一直很平稳。


以共享订阅的方式,部署两个示例。
EMQ发送消息:200TPS

两个进程分别占用的资源信息:

kafka监控的消息

尾记
总体的性能还是相当可以的,结合多线程&多节点部署完全满足我们的需求,扩展性也非常好,更重要的是轻量级,基于Drools api来实现,不需要引入额外的框架,技术风险完全可控。
网友评论