在编码过程中, 常会遇到一大类场景, 比如为特定的用户发送奖品. 最简单的实现方式就是把判定规则写在代码中. 但现实是复杂的,稍微扩展一下,就会发现这种方式是难以为继的,比如:
1. 运营希望能灵活的修改和增加规则
2. 希望不同规则之间能指定顺序
这会导致不断地写新代码,测试,发布,整体效率很低,并且每次响应需求都可能引入新的bug.
类似的场景还有很多, 为了让我们得工作变得轻松, 必然希望通过某种抽象来一劳永逸的解决问题.
而实际上, 我一直都认为: DSL是一种设计模式
而把范围集合用DSL描述,可以解决所有需要范围集合判定以及优先级判定的问题
在这个规则发奖的场景,实际上就是
DSL -> Action
比如:
“(ip>’1.2.3.4′ and ip<‘4.5.6.7′) or level>100” -> Reward
在这其中, “(ip>’1.2.3.4’ and ip<‘4.5.6.7’) or level>100”, 就是一个表达式. 可以用一些现成的词语法工具来得到一个解析器.
但好在这种表达式结构比较简单, 我们不用按照常规词法\语法\语义按部就班的实现, 在一个循环就可以完成词语法解析,从而加快效率
更有意思的是, 我们可以通过逐步压测分析组件的性能瓶颈, 一步步的优化. 通过一系列的优化, 成功讲单核性能,从60000qps提升到200000qps,多核可线性扩展
代码我放在Github:
https://github.com/redwood9/faster_expression_evaluation