Golang Go语言中如何动态加载判断条件

发布于 1周前 作者 yuanlaile 来自 Go语言

Golang Go语言中如何动态加载判断条件
接到一个小需求需要定时统计消息队列堆积的数量。刚开始需求很简单比如堆积大于 100 就放到群里通知,于是就用 go 写了一个小脚本来定时遍历和推送消息。但是后来发现 100 这个阈值并不适合每个队列,可能 a 需要 50 就通知,而 b 到 1000 才通知等等,但是每次都是去修改判断太麻烦了,突然想到有好多软件的告警都是在后台配置了规则就可以生效,请问他们这种功能是怎么实现的?

28 回复

启动参数?

更多关于Golang Go语言中如何动态加载判断条件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


复杂一点,你可能需要类似 apollo 这样的配置中心。简单一点,可以用 inotify 接口来监听配置文件的变化。

就是别把条件写死,而是使用 DSL 之类的。
参考:格林斯潘第十定律

你如果有集中的配置中心比如 zookeeper 这种,他是有 onchange 事件的, 监听对应的 key 的 onchange 事件就行;
你如果是配置文件可以用 fsnotify 这种监听文件变动的包

别瞎搞 dsl ,嵌入脚本完事儿了

规则引擎,参考 7 楼那个

我这边的方案,首先程序可以通过 Prometheus 暴露队列数量,然后一个报警就是一条 PQL 查询,配置多个定时任务执行你的报警 PQL

简单一点、写个配置文件 配置好队列名和值 定时或者监听文件修改读取就行了

简单点的就整个配置文件直接改配置文件就行, viper 有 OnConfigChange, 是支持配置文件变化回调的, 复杂的就配置中心, etcd Consul apollo 都行, 但我看你这需求真没必要这么大炮打蚊子, 配置文件加 watch 足够了

这怎么和规则引擎扯上关系的,你这不就是需要个能配置的地方吗,公司有配置中心就接一下,没有就轮询 MySQL 呗

cronjob + configmap ,你代码都不需要改,每次去改 configmap 就完了

写个 js 解

解释器,然后用 js 写(逃

开个 tcp 端口出来,通过请求更改配置(呜呼

你这个需求重载配置就能解决,别瞎搞…

lz 这需求你们让 lz 用规则引擎有点杀鸡用牛刀了吧。。。。

lz 的需求目前就是简单的想动态设置队列的阈值,最简单的难道不是把这些设置写成配置文件( json 、yaml 、toml 都可以),然后 go 程序定期从本地读这个配置不就好了。。。。。如果想玩的花一点那就把配置放配置中心之类的。。。

如果想基于晋升编程,不妨再进一步,记录下各个队列的最近消息速度,实现自适应阈值,比如一分钟一条的队列堆 10 条告警,一秒钟 100 条的堆 10000 条告警这样
然后整个 PPT 说自己基于业界最先进的 AIOps 理念,实现了智能告警体系,减少了 87.58%的告警量,减少了每个新消息队列发布配置消耗 3.75 人的工作量,告警准确率上升 280%

这个小需求的确没必要,但是很好奇规则引擎所以想学一下

你的这段话很有可能会出现在我明年的年终 PPT 里!

b 站有个规则引擎,或者考虑 golang-lua

写个 fsm reactor handler 适配一下不就行了?

log4j2 漏洞就是像这样一点点堆出来的……

viper 监听配置文件写个回调是不是可以搞一搞

在Go语言中,动态加载判断条件通常不是语言原生支持的特性,但你可以通过一些编程技巧来实现类似的功能。这通常涉及到反射(reflection)和接口(interface)的使用。

一种常见的方法是使用函数或闭包作为参数来传递判断条件。例如,你可以定义一个接受函数作为参数的函数,这个函数根据传入的条件来决定执行哪段代码。这样,你可以在运行时根据需要传递不同的判断条件。

此外,你还可以使用结构体和接口来定义更复杂的动态行为。通过定义一个接口,你可以让不同的结构体实现该接口,并在运行时根据需要选择使用哪个实现。

如果你需要更高级的动态行为,比如从外部配置文件中读取判断条件,你可以考虑使用配置文件解析库(如viper)来读取配置,并根据配置动态地构建判断条件。

需要注意的是,Go语言是一种静态类型的语言,其设计哲学倾向于编译时确定行为。因此,虽然你可以通过一些技巧实现动态加载判断条件,但这通常会增加代码的复杂性和运行时的开销。因此,在决定使用这种方法之前,请仔细考虑是否真的需要这种动态性,以及它是否值得带来的额外复杂性。

总的来说,Go语言提供了足够的灵活性来应对大多数编程需求,但你需要根据具体情况来选择最合适的方法。

回到顶部