我们通常使用Kafak+sparkstream+redis来作为我们实时数据处理的方案,需要处理各种关于实时计算的需求。
需求一:触发告警
流式数据的某个字段是一个固定的值,比如 state是off,而一旦这个值发生了改变,我们需要触发告警,比如state变成了on。
触发告警提示这个状态值出错。等这个值再次变为off的时候,需要再次触发告警,提示这个值已经恢复正常。在这个值异常期间,告警只触发一次。
需求一解决:将数据流的状态维护在redis里面,每过来一个数据流都去与之前的数据流的状态做一个比较,然后根据规则发出告警。
需求二:实时变更告警配置表
告警的规则维护在数据库的表里,要求在变更了告警的规则之后,触发告警的规则能实时发生变更而不需要重启程序。
解决:讲告警规则也维护在redis里。
总结:如果在spark里没有好的维护内存状态的方法,可以将状态维护在redis里。
优势:spark和redis组件的分隔使得实时促发成为可能,而redis优秀的读写能力也使得其成为优秀的状态保存栈。
劣势:这个架构能够支持的范围很是有限,对于海量数据或者高并发的情景,redis的处理还有一定的局限性,而如果使用redis集群和多线程满足亿级以内的数据不成问题,性能的瓶颈多在于组件的优化上。