大数据高并发场景下存量/增量指标实时计算方法

业务场景:

设备每10分钟上报一次A指标数据,需要对设备的A指标数据进行日增量/存量打标。即对于A指标,标记设备是存量设备还是增量设备。
日存量/增量判断标准:将当日设备上报A指标数据的总次数,与该设备前30天内上报的A指标数据的总次数进行对比。假如前30天内总次数超过n次且当日上报A指标数据的总次数超过n次则为该设备打存量标记。假如前30天内总次数小于n次且当日上报A指标数据的总次数超过n次则为该设备打增量标记。

设备数量上百万,且都按每10分钟一次进行指标数据上报。如何在大数据量且高并发的场景下快速的对设备进行存量/增量标记。

解决方式一:

在设备每次上报时进行打标。
使用redis缓存,一个key对应一个设备近30天每天的A指标数据出现次数,可以是一个json数组:

[{'day':'yyyyMMdd-1',‘aCount’:n-1},{'day':'yyyyMMdd-2',‘aCount’:n-2}...,{'day':'yyyyMMdd-30',‘aCount’:n-30},{'day':'yyyyMMdd-n',‘aCount’:n-current}]

每次上报都到redis中查询对应key,对json数组进行维护,删除前30天之外jsonobject,同时对30天内的指标总数进行累加。查询当日的jsonobject中A指标数据总数,进行对比并做存量增量判断。最后将当日A指标总数进行更新,对于当日第一次A指标上报进行json数组的追加操作,第二次以上进行json数组的替换操作。整个key设置31天过期。

解决方式二:

在多线程和高并发场景下,如果因为前置组件发生消息堆积,导致一批数据中存在多个同一设备多条A指标数据报文。而有多个线程同时对某个设备多条A指标数据报文进行处理,使用方式一会存在A指标数据计数总量不准确的情况。考虑在A的整个逻辑之外增加一个基于redis的有过期时间的分布式锁。当某个线程对指定设备的A指标进行计数和判断时,加分布式锁,其他线程遇锁等待,直到锁释放或者过期,再执行增量/存量判断。

解决方式三:

使用定时任务离线异步的进行处理。持久化每日所有设备的A指标数据发生次数,某个时间点对当日所有设备进行判断,分别比对其前30天的指标总次数,进行打标。

该方法有如下不足:
1.需要开辟更多磁盘空间。
2.定时任务执行时间有限制,需慎重选择。
3.假如有后置任务需要依赖存量/增量标识,会存在定时任务执行超时或者执行异常导致后置任务受影响的可能。

如有更简单高效方法欢迎留言~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章