惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
V
V2EX
GbyAI
GbyAI
量子位
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
S
SegmentFault 最新的问题
O
OpenAI News
N
News and Events Feed by Topic
博客园 - Franky
爱范儿
爱范儿
Forbes - Security
Forbes - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V2EX - 技术
V2EX - 技术
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Schneier on Security
Schneier on Security
Cloudbric
Cloudbric
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
Last Week in AI
Last Week in AI
罗磊的独立博客
Spread Privacy
Spread Privacy
Recent Announcements
Recent Announcements
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
The Register - Security
The Register - Security
Y
Y Combinator Blog
J
Java Code Geeks
I
Intezer

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis 微服务中的熔断算法 漏桶算法和令牌桶算法 jsonparser 为什么比标准库的 encoding/json 快 10 倍 ? zap 高性能设计与实现 HTTP Router 算法演进 fastcache 高性能设计与实现 Web 常见的三个安全问题 ants Code Reading Go 线程安全 map 方案选型 布隆过滤器 死锁、活锁、饥饿、自旋锁 sync.Pool Code Reading Go 内存管理概述 Go netpoll Code Reading goroutine 泄漏与检测 time/Timer Code Reading GMP Scheduler Code Reading Go channel 的 15 条规则和底层实现 为什么 Linux “一切皆文件” context.Context Code Reading runtime/HACKING.md Goland 最佳实践 互联网开发与金庸武学 为什么 Redis 6.0 引入多线程模型? Kubernetes 应用最佳实践 - 金丝雀发布 容器中如何正确配置 GOMAXPROCS ? singleflight Code Reading sync.Map Code Reading sync.Cond Code Reading sync.WaitGroup Code Reading sync.RWMutex Code Reading sync.Mutex Code Reading sync.Once Code Reading Go 无锁编程 sync/atomic Code Reading goroutine 交替打印奇偶数 GODEBUG Go 并发模式 Go 汇编 UUID 通用技术选型 Kubernetes 应用最佳实践 - 水平自动伸缩 Go 高性能 Tips fasthttp 为什么比标准库 net/http 快 10 倍 ? 技术文章配图指南 ChatGPT 初体验 Docker 网络原理概览 iptables 的五表五链 Kubernetes 应用最佳实践 - 亲和性和污点容忍度 Go 的反射与三大定律 Docker 官方提供的最佳实践 Go 语言内置的设计模式 HTTP1 到 HTTP3 的工程优化 Kubernetes 应用最佳实践 - Sidecar 模式 Kubernetes 应用最佳实践 - init 容器和钩子函数 为什么 recover 必须在 defer 中调用? 为什么 defer 的执行顺序和注册顺序不同? Go map 设计与实现 Go 切片扩容底层实现 Go 语言中的零拷贝 Go Delve 云原生和边缘计算简介 Kubernetes Pod 服务质量等级 Kubernetes 应用最佳实践 - 探针 Kubernetes 应用最佳实践 - 资源请求和限制 CDN 原理 Kubernetes 应用最佳实践 - 开篇 缓存策略和模式 Go 内存模型 Kubernetes 核心概念 软件版本语义化
业务规则引擎演变过程简述
2023-08-07 · via 蛮荆

业务规则引擎演变过程简述

2023-08-07 软件工程 业务逻辑

概述

技术实现的角度,规则引擎的功能就是布尔表达式的解析和求值过程,外加建立在求值结果之上的工作流。 业务使用的角度,规则引擎就是运营人员可以独立快速操作业务逻辑规则并且影响到最终的用户。

# 规则引擎的典型语法

rule  <rule_name> <rule_description>
   <attribute> <value> {
   when
      <conditions>
   then
      <actions>
}

常见场景

  • 网页中的保险广告: 根据各种条件最后计算出你的投保金额
  • 网约车: 根据车型、天气、目的地、拥堵情况等计算出价格
  • 网上购物: 会员、优惠券、店铺活动等计算订单价格
  • 网站内容反爬虫: IP、访问频率、浏览行为模式等判定客户端是否为正常用户

演变过程

下面简单概括下常规的规则引擎的演变过程,以及过程中开发人员和运营人员的不同分工。

代码

在这个阶段,业务规则全部由开发人员完成,运营有任何变更,都需要找到开发经历开发 -> 测试 -> 生产的过程,沟通加具体的工作量要花掉可观的时间, 而且系统的业务规则没有任何灵活性,今天应该没有公司这么干了,不过作为上古的工作模式,这里简单提一下。

代码更改业务规则阶段

服务

根据不同的业务规则进行分类,所有请求统一由业务引擎代理转发到不同的服务,代理同时也需要处理认证和鉴权,例如根据用户的会员等级转发到不同的服务。 在这个阶段,业务规则全部由开发人员完成,但是和上一阶段不同的地方在于: 业务引擎代理将代码中公共逻辑和具体业务逻辑进行了分离,如果运营策略有变化, 开发人员只需要修改规则引擎代理即可,不会污染到其他服务模块代码。

自动配置

将业务规则抽离出来保存到配置中,这里的配置可以是文本配置文件、代码配置文件,也可以是通过管理后台操作并最终保存到数据库的配置信息。

在这个阶段,开发人员需要和运营人员提前写好所有的业务规则,虽然已经有了自动化的基本雏形,但是灵活度还远远不够 (例如 10 点刚写完业务规则,11 点又想到几个新的规则…)。

图片来源: https://g.alicdn.com/aic/aep-docs/1.6.1/ze9s2o.html

表达式解析

使用定义好的布尔表达式替换掉代码中的 if else 语句,业务逻辑代码只需要对具体的布尔表达式求值,然后根据求值结果来执行不同的操作。

这里以 Go 语言生态的 govaluate 组件来做演示,其 Github 的主页上面的简介: 可以对任意的 Go 表达式语句求值。

例如在一个视频网站中,我们可以根据用户是否 VIP 来决定播放视频广告。

// 获取用户信息
user := getUserInfo()

expression, err := govaluate.NewEvaluableExpression("user.level > 0")
isVip, err := expression.Evaluate(nil)

if err != nil {
	panic(err)
}

if isVip {
	// 不播放广告
} else {
	// 播放 60s 广告
}

在这个阶段,业务规则可以随时更新,但是必须要由懂系统/服务实现编程语言的人员来编写规则,大部分情况下,业务规则依然全部由开发人员完成。

对于 govaluate 组件内部将表达式编译为 AST 的过程感兴趣的读者可以看看 这篇文章

DSL

针对特定领域的语言,也就是专门解决某个特定领域的问题,分为内部 DSL 和外部 DSL,规则引擎中用到的都是外部 DSL,主要是给开发人员和经过培训的其他岗位人员。

图片来源: https://g.alicdn.com/aic/aep-docs/1.6.1/ze9s2o.html

这方面的例子太多了,我们日常使用的编程语言和数据库 SQL 语句本质上都是高度抽象的 DSL :-)

ElasticSearch 全文搜索

# 全文搜索 hello world

GET /xxx/yyy/_search
{
    "query" : {
        "match" : {
            "about" : "hello world"
        }
    }
}

Prometheus 聚合操作

# 计算 HTTP 请求总量

sum(http_requests_total)

在这个阶段,开发人员和运营人员大部分情况下分工完全独立,开发人员专注于 DSL 的丰富和完善,运营人员专注于编写各种 DSL, 但是当发布新的 DSL 语法时或者现有的 DSL 存在问题时, 开发人员和运营人员需要沟通协调。

规则引擎中台

可视化操作界面,通过点击、拖拽等操作自动生成规则并保存,运营人员只需要关注操作界面即可。

图片来源: https://g.alicdn.com/aic/aep-docs/1.6.1/ze9s2o.html

在这个阶段,开发人员和运营人员分工完全独立。开发人员专注于中台的功能建设,运营人员专注于业务策略的调整,但是系统的业务能力依然会受到以下几个因素的影响:

  • 运营人员设置的业务规则有效性
  • 业务规则设置完成到生效的实时性
  • 无法实现自动化处理 (例如紧急事件的处理周期非常短,是否能在有效时间内指定出有效的规则)

AI 构建

目前来看,最后阶段是使用 AI 模型来构建完全自动化的业务规则,完全解决规则引擎中台存在的问题。

软件定义一切,软件吞噬一切。

扩展阅读