首页
学习
活动
专区
圈层
工具
发布

Google Aviator——轻量级 Java 表达式引擎实战

除了应用了 Rete 核心算法,开源软件 License 和 100% 的Java实现之外,Drools还提供了很多有用的特性。...其中包括实现了JSR94 API和创新的规则语义系统,这个语义系统可用来编写描述规则的语言。...IKExpression 简介IK Expression 是一个开源的、可扩展的, 基于java 语言开发的一个超轻量级的公式化语言解析执行工具包。...Groovy 与 Java 平台非常融合,包括大量的java类库也可以直接在groovy中使用。...cacheKey 是用来指定缓存的 key,如果你的脚本特别长,默认使用脚本作为 key 会占用较多的内存并耗费 CPU 做字符串比较检测,可以使用 MD5 之类唯一的键值来降低缓存开销。

8.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    这 5 种规则引擎,真香!

    1.五大常用规则引擎 1.1 Drools:企业级规则引擎扛把子 官网:https://www.drools.org/ 适用场景: 金融风控规则(上百条复杂规则) 保险理赔计算 电商促销体系 实战:折扣规则配置...算法实现 支持复杂的规则网络 完善的监控管理控制台 缺点: 学习曲线陡峭 内存消耗较大 需要依赖Kie容器 适合:不差钱的大厂,规则复杂度高的场景 1.2 Easy Rules:轻量级规则引擎之王 官网....evaluate("user.age > 18 && order.amount > 100");  引擎 耗时 Aviator 220ms Groovy 1850ms 编译优化: // 开启编译缓存...支持异步、并行、条件分支 热更新规则 缺点: 新框架文档较少 社区生态待完善 适合:需要灵活编排的复杂业务流 2 五大规则引擎横向评测 性能压测数据(单机1万次执行): 引擎 耗时 内存占用 特点 Drools...内存溢出 // 设置无状态会话(避免内存积累) KieSession session = kContainer.newStatelessKieSession(); QLExpress安全漏洞 // 禁用危险方法

    1.2K21

    2018-10-31 网易考拉规则引擎平台架构设计与实践

    而在业务风控中需要使用到规则决策的场景更多,由于涉及规则的保密性,这里就不展开了。总之,基于这个出发点,安全部决定开发出一个通用的规则引擎平台,来满足以上场景。...groovy可以和spring完美结合,并且可以自定义各种组件实现插件化开发。 当规则集变得复杂起来时,使用drools管理起来有点力不从心。...当然还有另外一种方式是将drools和groovy结合起来,综合双方的优点,也是一种不错的选择,大家可以尝试一下。...使用预加载的方式加载已有的规则,并将加载后的对象缓存起来,每次规则变更时重新load整条规则,极大的提升了引擎的执行效率 计数器引入AtomicLongFieldUpdater工具类,来减少计数器的内存消耗...现在整个平台的数字化做的比较弱,没法形成数据驱动业务。而风控的运营往往是需要大量的数据去驱动规则的优化的,比如规则阈值的调试、规则命中率、风险大盘等都需要大量数据的支撑。

    1.5K30

    微分享回放 | 携程是如何把大数据用于实时风控的

    风控引擎:主要处理风控请求,有预处理、规则引擎和模型执行服务,风控引擎所需要的数据是由数据服务模块提供的。 数据服务:主要有实时流量统计、风险画像、行为设备数据、外部数据访问代理,RiskGraph。...由于携程的业务种类非常多,而且每种业务都有其特性,在进入风控系统(Aegis)后,为了便于整个风控系统对数据进行处理,风控前端有一个适配器模块,把各个业务的数据都按照风控内部标准化配置进行转换,以适合风控系统使用...这样携程风控引擎 ,实现了 规则上线的高效携程风控实时引擎 通过使用 规则引擎Drools,使其具有非常高的灵活性、可配置性,并且由于是java语法的,规则人员自己就可以制定规则并迅速上线。...数据服务层的核心思想就是充分利用内存(本地、Redis) 1、本地内存(大量固定数据,如ip所在地、城市信息等) 2、充分利用Redis高性能缓存 由于实时数据流量服务、风险画像数据服务的数据是直接存储在...Redis中,由于风控系统能够知道这些数据发生变化的Message,所以这些数据被持久化到DB中也是ok的,当然,这些数据也有一个TTL参数来保证其新鲜度。

    1.7K80

    携程是如何把大数据用于实时风控的?

    风控引擎:主要处理风控请求,有预处理、规则引擎和模型执行服务,风控引擎所需要的数据是由数据服务模块提供的。 数据服务:主要有实时流量统计、风险画像、行为设备数据、外部数据访问代理,RiskGraph。...由于携程的业务种类非常多,而且每种业务都有其特性,在进入风控系统(Aegis)后,为了便于整个风控系统对数据进行处理,风控前端有一个适配器模块,把各个业务的数据都按照风控内部标准化配置进行转换,以适合风控系统使用...这样携程风控引擎实现了规则上线的高效携程风控实时引擎,通过使用规则引擎Drools,使其具有非常高的灵活性、可配置性,并且由于是java语法的,规则人员自己就可以制定规则并迅速上线。...数据服务层的核心思想就是充分利用内存(本地、Redis): 本地内存(大量固定数据,如ip所在地、城市信息等); 充分利用Redis高性能缓存。...Redis中,由于风控系统能够知道这些数据发生变化的Message,所以这些数据被持久化到DB中也是ok的,当然,这些数据也有一个TTL参数来保证其新鲜度。

    3.2K80

    规则引擎Drools在贷后催收业务中的应用

    为了让开发人员从大量的规则代码的开发维护中释放出来,把规则的维护和生成交由业务人员,为了达到这种目的通常我们会使用规则引擎来帮助我们实现。...当用户在 Drools 中添加或更新规则相关信息时,该信息会以一个或多个事实的形式插入 Drools 引擎的工作内存中。Drools 引擎将这些事实与存储在生产内存中的规则条件进行模式匹配。...在下一次事实集合发生变化时(绝大多数的结果都不需要变化)通过从内存中取值,避免了大量的重复计算。...3.2 规则的设计3.2.1 决策表设计催收系统自研了一套决策表的解决方案,将drl中的条件和结果语句抽象成结构化数据进行存储并在前端做了可视化页面提供给业务人员进行编辑不需要编写规则脚本。...催收系统虽然使用的drools7.x版本,但是使用的方式依然使用的是5.x的程序化构建器方法(Knowledge API)催收系统目前规则固定页面上只能编辑无法新增规则,只能通过初始化数据库表的方式新增规则

    2.3K21

    drools规则动态化实践

    这时候我们就需要集成规则引擎对这些判断进行线上化的管理 二、规则引擎选型 目前开源的规则引擎也比较多,根据原有项目依赖以及短暂接触过的规则引擎,我们着重了解了一下几个 drools: -社区活跃,持续更新...根据drl文件生成规则的工作内存,通过KieSession或者StatelessKieSession与工作内存交互。整个流程并不复杂。...但是,这样并不能满足我们线上化判断,或者频繁更改规则的诉求。于是我们在实践中需要对drools更高阶的使用方式。...以下是我了解过的四种动态的方案: drt文件,创建模板,动态生成drl文件,也是我们目前所用的方式。 excel文件导入,实际上和模板文件类似,依然无法直接交给业务人员来使用。...在这种情况下,如果使用静态的drl文件来实现这些规则,需要数百规则文件,维护量大,且每次修改后使规则生效的代价较大。在此背景下,我们尝试drools高阶应用,既规则动态化实践。

    1.3K10

    实时业务风控系统

    实时计算 要将任意维度的历史数据(可能半年或更久)实时统计出结果,需要将数据提前安装特殊结果准备好(由于事件的维度数量不固定的,选取统计的维度也是随意的,所以不是在关系数据库中建几个索引就能搞定的),需要利用空间换时间...计算的性能消耗极少,优势明显 redis lua 把保存维度,计算频数,过期维度数据等操作,使用lua脚本结合在一起,可以减少网络IO,提供性能 mongodb mongodb本身的聚合函数统计维度,支持很多比如...,这样可以使用内存计算,速度较快。...但是redis为了性能牺牲了很多空间,数据重复存储,会占用很多内存。...的详细文档,请参考官方http://docs.jboss.org/drools/release/6.4.0.Final/drools-docs/html_single/index.html 部署 系统默认采用

    3K10

    从零搭建精准运营系统

    ,无需重启系统即使生效,减少沟通成本和避免重复开发,总之就是要更加 自动化 和 易配置 采集实时数据,根据实时事件做实时推送,总之就是要 实时 技术选型 数据采集、转换、存储 采集:状态类的数据主要放在各个业务系统的关系型数据库中...,由于历史原因有postgres和mysql,需要实时采集表的数据变更,这里使用kafka connector读取mysql的binlog或postgres的xlog,另外还有标签系统计算出来的标签,在...kafka connector有以下优点: 提供大量开箱即用的插件,比如我们直接用debezium就能解决读取mysql和pg数据变更的问题 伸缩性强,对于不同的connector可以配置不同数量的task...劣势: 单机全内存方案,需要整合其他分布式和存储。 以内存实现时间窗功能,无法支持较长跨度的时间窗。 无法有效支持定时触达(如用户在浏览发生一段时间后触达条件判断)。...规则配置控制台:提供可视化配置界面(运营规则配置、数据采集规则配置、字段元数据配置等) 报表服务:提供报表查询功能 运营位服务:提供外部接口,根据条件匹配运营位(如启动图、首页banner图片等) 总结与展望

    2.1K31

    性能调优思路

    寻找性能瓶颈 性能瓶颈的表象:资源消耗过多、外部处理系统的性能不足、资源消耗不多但程序的响应速度却仍达不到要求。...资源消耗 CPU、文件IO、网络IO、内存 外部处理系统的性能不足:所调用的其他系统提供的功能或数据库操作的响应速度不够。...文件IO消耗分析 Linux在操作文件时,将数据放入文件缓存区,直到内存不够或系统要释放内存给用户进程使用。所以通常情况下只有写文件和第一次读取文件时会产生真正的文件IO。...内存消耗分析 -Xms和-Xmx设为相同的值,避免运行期JVM堆内存要不断申请内存 对于Java应用,内存的消耗主要在Java堆内存上,只有创建线程和使用Direct ByteBuffer才会操作JVM...采用合理的缓存失效算法:如果放入太多对象在缓存池中,反而会造成内存的严重消耗, 同时由于缓存池一直对这些对象持有引用,从而造成Full GC增多,对于这种状况要合理控制缓存池的大小,避免缓存池的对象数量无限上涨

    1.1K60

    JAVA设计模式11:享元模式,避免创建大量相似对象的开销

    它适用于存在大量相似或相同对象的情况,通过共享这些对象的内部状态,可以减少内存的消耗。...当需要使用对象时,通过传递外部状态来定制对象的行为。 使用享元模式具有以下优点: 减少内存消耗:通过共享对象的内部状态,减少了创建相似对象的开销。...提高性能:由于共享对象,可以减少对象创建的时间和内存消耗,从而提高系统性能。 然而,享元模式也有一些缺点: 对象共享可能引入线程安全问题:如果多个线程同时使用共享对象,可能需要考虑线程安全性。...在Java中,可以使用享元模式来优化对象的创建和内存消耗,特别是在需要大量相似对象的场景中,如连接池、线程池、字形缓存等。...亨元模式的核心思想是什么?它是如何通过共享对象来减少内存消耗的? 请解释享元模式中的内部状态和外部状态的概念。 享元模式和单例模式有什么区别? 请描述享元模式的优点和缺点。

    94950

    JAVA设计模式12:享元模式,避免创建大量相似对象的开销

    一、什么是享元模式 享元模式是一种结构型设计模式,旨在通过共享对象来最大限度地减少内存使用和创建相似对象的开销。它适用于存在大量相似或相同对象的情况,通过共享这些对象的内部状态,可以减少内存的消耗。...当需要使用对象时,通过传递外部状态来定制对象的行为。 使用享元模式具有以下优点: 减少内存消耗:通过共享对象的内部状态,减少了创建相似对象的开销。...提高性能:由于共享对象,可以减少对象创建的时间和内存消耗,从而提高系统性能。 然而,享元模式也有一些缺点: 对象共享可能引入线程安全问题:如果多个线程同时使用共享对象,可能需要考虑线程安全性。...在Java中,可以使用享元模式来优化对象的创建和内存消耗,特别是在需要大量相似对象的场景中,如连接池、线程池、字形缓存等。...亨元模式的核心思想是什么?它是如何通过共享对象来减少内存消耗的? 请解释享元模式中的内部状态和外部状态的概念。 享元模式和单例模式有什么区别? 请描述享元模式的优点和缺点。

    51100

    调研技术组件模板V1 —— 以 Drools 为例

    规则引擎优点 声明式编程 逻辑和数据分离 速度和可扩展性 知识集中化 规则引擎缺点 复杂性提高 需要学习新的规则语法 引入新组件的风险 原理了解 这个组件实现机制是什么样的?...Drools规则引擎的结构示意图: 在 Drools 中,规则被存 放在 Production Memory(规则库)中,推理机要匹配的 facts(事实)被存在 Working Memory(工作内存...当时事实被插入到工作内存中后,规则引擎会把事实和规则库里的模式进行匹配,对于匹配成功的规则再由 Agenda 负责具体执行推理算法中被激发规则的结论部分,同时 Agenda 通过冲突决策策略管理这些冲突规则的执行顺序...Rete 匹配算法是一种进行大量模式集合和大量对象集合间比较的高效方法,通过网络筛选的方法找出所有匹配各个模式的对象和规则。...从Drools规则引擎的使用模版来看,输入、输出和判断三个中,判断是变化的,而输入和输出是基本固定的,所以适用的场合可以分为下面几种: 输入和输出的参数不变,即:规则文件接收固定的参数,产生固定的输出。

    99410

    【愚公系列】2023年11月 二十三种设计模式(十一)-享元模式(Flyweight Pattern)

    适用场景:享元工厂适用于需要大量相似对象,并且希望通过共享来减少内存消耗和提高性能的情况。它在多次创建和销毁对象的场景中特别有用。...享元工厂在享元模式中扮演着关键的角色,它管理着享元对象的创建、共享和池化,以提高系统的效率和性能。通过享元工厂,可以有效地重用已存在的对象,降低内存开销,适用于需要大量相似对象的情况。...提高性能:由于对象共享和重用,享元模式可以显著提高系统性能。减少对象的创建和销毁开销,使系统更加高效。支持大量对象:享元模式适用于需要管理大量对象的情况,而不会因为对象过多而导致内存不足或性能下降。...共享状态的变化只需在一个地方进行维护,而不需要修改大量对象的状态。节省资源:由于对象共享,系统中创建的对象数量较少,因此节省了资源,包括CPU时间和内存。...例如,多个按钮对象具有相同的样式和行为。状态外部化:当对象的状态可以被外部化,并且可以在多个对象之间共享时,可以考虑使用享元模式。共享的状态信息通常存储在享元对象之外,可以在多个对象之间共享。

    32331

    人人都在用的Spakr调优指南

    注意,这种方法,一定要确保电脑的内存能够承受测试的数据,不然会报出oom异常。 通过以上的简介,大概知道了内存的消耗和如何查看消耗的内存了。...总结,需要用到Kryo序列化机制的场景,算子内部使用了外部的大对象或者大数据结构。那么可以切换到Kryo序列化,序列化速度更快,和获得更小的序列化数据,减少内存的消耗。...,实际上是Spark应用程序把数据文件通过driver发送给每一个节点的每一个task,很明显,这样会造成大量的网络IO操作,大量消耗节点上的内存。...其实很容易想到,把一份大数据文件发送给每个节点就OK了,单个节点的所有task共享一份数据,这样就会节省大量的网络IO操作和节省大量内存消耗。...这样做的创新性是避免了大量数据的网络传输造成网络IO和内存的消耗。因此引出一个叫“数据本地化”的概念。 数据本地化对于Spark Job性能有着巨大的影响。

    59220

    《现代Javascript高级教程》Javascript执行上下文与闭包

    闭包保持了回调函数的上下文,使得回调函数可以访问外部的processData函数。 4. 缓存和记忆化 闭包还可以用于实现缓存和记忆化功能。...内存消耗 闭包会导致内存占用增加,因为它们会保留对外部变量的引用,即使外部函数执行完毕。这可能会导致内存占用过高。...内存泄漏 由于闭包会持有对外部变量的引用,如果不正确地处理闭包的使用,可能会导致内存泄漏。如果一个闭包长时间存在,但不再需要,它会一直持有对外部变量的引用,使这些变量无法被垃圾回收。...性能影响 闭包可能对性能产生一定的影响,特别是在涉及大量变量或复杂词法环境的情况下。闭包的创建和执行可能消耗更多的时间和资源。...由于闭包保留了这个结果,闭包的执行可能会耗费更多的时间和资源。 为了减少闭包的缺点,我们可以采取以下措施: 优化内存使用:在闭包中避免持有大量数据或不必要的引用。确保只 保留必要的变量和引用。

    34630

    Java二十三种设计模式-享元模式(1223)

    常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。 享元模式是一种结构型设计模式,旨在通过共享来减少创建大量相似或相同对象时的内存消耗。...对象创建成本高:如果对象的创建过程复杂或成本高昂,享元模式可以通过共享来降低这些成本。 对象状态外部化:当对象的状态可以被外部化,即对象的行为可以通过外部状态参数化,而不是依赖于对象内部状态时。...讨论在内存敏感的应用中享元模式的应用: 移动设备:在移动应用开发中,由于内存限制,享元模式可以用来减少内存消耗。 嵌入式系统:在嵌入式系统中,内存和处理能力有限,使用享元模式可以提高效率。...难以识别享元对象 内部状态识别:有时难以识别哪些部分是共享的内部状态,哪些是外部状态。 可能影响缓存 缓存策略:享元模式可能会影响系统的缓存策略和内存访问模式。...享元模式是一种强大的设计模式,可以显著减少内存消耗并提高性能,特别是在处理大量相似对象的场景中。然而,它也需要谨慎使用,以避免增加系统的复杂性和维护难度。

    31110

    高性能服务器架构思路(三)——分布式系统概念

    使用第一种策略的系统,运行的时候,直接根据操作系统提供的诊断工具,就能直观的监测到每个功能模块的性能消耗,因为操作系统提供进程盒子的同时,也能提供对进程的全方位的监测,比如CPU占用、内存消耗、磁盘和网络...由于要管理大量的进程,传统的依靠配置文件来配置整个集群的做法,会显得越来越不实用:这些运行中的进程,可能和其他很多进程产生通信关系,当其中一个进程变更通信地址时,势必影响所有其他进程的配置。...那么,如果我们希望能处理更多的任务,就必须要启动更多的进程,以便充分利用那些阻塞的时间,但是由于进程是操作系统提供的“盒子”,这个盒子比较大,切换耗费的时间也比较多,所以大量并行的进程反而会无谓的消耗服务器资源...由于多线程是基于对一个函数调用的并行运行,这个函数里面可能会调用很多个子函数,每调用一层子函数,就会要在栈上占用新的内存,大量线程同时在运行的时候,就会同时存在大量的栈,这些栈加在一起,可能会形成很大的内存占用...并且,我们编写服务器端程序,往往希望资源占用尽量可控,而不是动态变化太大,因为你不知道什么时候会因为内存用完而当机,在多线程的程序中,由于程序运行的内容导致栈的伸缩幅度可能很大,有可能超出我们预期的内存占用

    73700
    领券