cloudevents + jmespath 简单规则执行
实际上属于一个简单的业务场景,数据实体基于了cloudevents,但是希望进行里边数据的check,对于不用的check 结果会有一些action(比如发送通知等),以下是一个简单实现示例
参考代码
- demo.js
import jmespath from "jmespath";
import { CloudEvent } from "cloudevents";
const event = new CloudEvent({
type: "com.example.sampletype",
source: "/mycontext",
data: { data1: 11, data2: 22, data3: 33 },
});
function logRule1(value) {
console.log(`Rule 1 triggered: data1 is ${JSON.stringify(value)}`);
}
function logRule2(value) {
console.log(`Rule 2 triggered: data2 is ${value}`);
}
function logRule3(value) {
console.log(`Rule 3 triggered: data3 is ${value}`);
}
const actionFunctions = {
logRule1,
logRule2,
logRule3,
};
const rules = [
{
name: "Rule 1: data1 is greater than 10",
query: "{data1: data.data1, data2: data.data2, data3: data.data3}",
condition: "data.data1 > 10 && (data.data2 === 22)",
action: "logRule1",
isComplex: true,
},
{
name: "Rule 2: data3 is equal to 33",
query: "data.data3",
condition: "=== 33",
action: "logRule3",
}
];
rules.forEach((rule) => {
const result = jmespath.search(event, rule.query);
const conditionFunction = rule.isComplex ? new Function("data", `return ${rule.condition}`) : new Function("value", `return value ${rule.condition}`);
if (result !== null && conditionFunction(result)) {
const actionFunc = actionFunctions?.[rule.action];
if (typeof actionFunc === "function") {
actionFunc(result);
} else {
const actionFunction = new Function(
"value",
"return `" + rule.action + "`"
);
console.log(actionFunction(result));
}
}
});
- 代码简单说明 对于配置我们使用了直接的json 格式,不附带函数,函数是动态创建或者通过查找的,比如condtion的执行,里边包含了简单表达式以及复杂表达式,使用了一个独立的字段标识了,对于复杂格式,condition 必须使用data. 格式,对于数据的拼接我们直接使用了jmespath 可以方便的进行数据,当然直接将cloudevents 的data 传递也是可以的, 比如query 使用
data
说明
以上是一个简单的玩法,核心是利用了jmespath 处理,以及动态函数创建,如果希望实现复杂的规则处理,可以使用一些其他引擎工具
浙公网安备 33010602011771号