从Redis中智能设置阀值获取通知(redis阀值通知)
从Redis中智能设置阀值获取通知
随着互联网业务的不断发展,大数据应用愈发普及,如何快速准确地获取业务异常信息成为很多企业需要解决的问题。在对故障信息监控中,智能地对于取值的设定可以提高问题发现的效率以及降低资源的浪费。此时,Redis智能设置阀值的功能成为了解决这个问题的一种非常合适的方式。
Redis是一款基于内存的高性能键值存储系统,在互联网应用中被广泛应用。它具备多种功能和接口,支持分布式数据库和多种数据结构,我们只考虑其中的 sorted set 类型用于阀值判断。在Redis中,sorted set 是一个比较特殊的数据结构,它不仅可以实现数据的排序,还可以实现对数据的查找和范围取值。
那么,我们想要利用Redis关联数据结构的排序和查询功能,如何设计一个完整的方案来实现阀值获取通知的效果呢?
1、阀值的设置
在Redis中,利用 sorted set 的有序性,可以给不同的指标设定不同的阀值。例如我们以业务结果的延迟时间作为指标,而延迟时间的阈值 thresholds 为 10ms,20ms,50ms,100ms 等。
zadd "serverDelayThreshold" 10 "10ms"
zadd "serverDelayThreshold" 20 "20ms"zadd "serverDelayThreshold" 50 "50ms"
zadd "serverDelayThreshold" 100 "100ms"
其中,zadd 命令参数:sorted set 的 key, 分值和成员。通过这样可以对不同的指标进行不同的阀值设定。
2、业务数据存储
我们通过业务数据存储,在Redis中将多个数据点拼成一个 dataStr,存储联合条件keyStr下。以下为其中的一个样例:
set "keyStr_dataStr" "business1_tenant1|1,67,100,200,2|1634911234"
其中,数据为 4 个点(1,67,100,200),另外加上业务ID,租户ID和时间戳。
3、阀值判断
实时监测业务中数据点的取值,将数据点的值存入 sorted set zset,利用 zrangewithscores 命令判断 realizedValue 处于 sorted set 的哪个位置; 判断 realizedValue 是否超出阀值,如超出阀值,计入临时 sorted set severeErrSortedSet,其实现如下:
realizedValue = 120
zadd "serverDelayZset" realizedValue timestampsevereErrSortedSet = zrangebyscore "serverDelayZset" 100 0
其中,zrangebyscore 命令参数为:sorted set 的 key, 分值上下值(因为分值最大设定为100 所以为[100,0]),且红灯阀值为100ms。
得到 severeErrSortedSet 后,就可以通过 redis pubsub 的方式实现通知发现。具体实现方式就是阈值变化后向某个频道发送消息,订阅这个信息的通知模块可以及时接收新的信息,然后处理故障消息提醒。
在目标频道发布信息
publish 'setThresholdNotice' 'redis is super!'
通过这样,我们可以实现阀值的智能动态调整,达到更好的告警效果。
4、定期阈值优化和数据删除
业务数据每隔固定时间(例如一天)进行一次错峰清理,在此过程中,将联合条件中的时间戳与当前时间差值,若大于该租户配置的清理策略,则删除 keyStr_dataStr。在定时任务中,对各个阀值进行梳理,不断调整阈值,以达到更好连接率的效果。
以上即是从Redis中智能设置阀值获取通知的实现方法,通过阀值的智能动态调整,可以达到更好的故障告警效果,进一步提升线上系统的可用性。