2

我有一个场景,消息以 300,000/秒的速度进入我的系统,系统将通过将每条消息与特定规则进行匹配来确定每条消息的去向(客户端)。

现在的挑战是有 10,000 个客户端(假设每个客户端只有一个由用户定义的规则),因此对于每条传入的消息,它将与每个规则匹配以确定它应该去哪里(一条消息可以去多个不同的客户端如果它符合规则)。

现在,让我们更具体一些。

例如,一条消息由以下字段组成。

消息(类型、区域、级别、...)

一条规则可能很复杂,但现在让我们把它变成一个简单的规则

rule1: (输入 (100, 200, 300) && region not in (A, B , C)) || 水平 (100)

请记住,在现实世界中,一条消息大约有 50 个字段左右,并且规则可能比这复杂得多。

这里的问题是:

  • 有什么方法可以减少匹配消息所需的时间吗?或者

  • 是否可以“将所有规则合并为一个”?

我想到的是 FSM,但我对它一点也不熟悉,所以你的任何提示将不胜感激。

编辑:

我尝试了 Drools,结果证明它是可行的,但它的性能远非好(嗯,它可以适用于大多数其他用例)。

就我而言,它每秒只能处理大约 5k 条消息,但我一眼就能看到 300k 条消息。所以现在我在想也许规则引擎很难满足我的要求。

有任何想法吗 ?

提前非常感谢。

4

1 回答 1

0

让我自己回答。

实际上,我需要的是某种表达式评估器,而不是一个大的规则引擎,所以当我知道这一点时,我发现 GNU JEL(Java 表达式库)已经存在多年了。

JEL 编译每个指定的表达式,然后客户端在评估它时可以给它一个运行时实例的上下文,这可以非常非常快。例如,对于给定的单个表达式,JEL 可以在一秒钟内计算超过 1,000,000 次(这取决于给定表达式的复杂性和要匹配的数据)

所以 JEL 是迄今为止对我来说最合理的解决方案。

希望这篇文章能给你一点启发。

于 2013-04-10T08:57:41.667 回答