一、什么是实时数据
一般来说,实时数据指的是对数据的传输、处理或最后交付发生在数据刚产生的短暂瞬间,如实时同步、实时消息处理等。用来衡量实时的指标是数据从产生端到消费端的传输时延。
另外一种实时数据,则指的是对查询或者计算的响应是否足够快速,更多针对于数据库的内建分析或者查询引擎。这种实时数据技术的衡量指标是响应时间。如果传输时延或者响应时间能够控制在亚秒或者数秒内,我们可以称这些技术是”实时数据”技术。
从用户的角度看,他们能够感受到的是一个“交互”式的体验,例如我执行一次查询,或者调取一个最新统计数字,结果通常在 1-3 秒之内返回,就是一种较为理想的实时体验。
二、什么是准实时数据
实时数据和T+1数据几个最最明显的特征:
1,时效性:
顾名思义,这个特征恐怕就是我们对实时数据、准实时数据和离线数据三种数据最能有感知的点
2,计算模式:
当前大数据领域所有的数据处理方式只有两种方式,一种就是流处理,另一种就是批处理,这两者的区别大致是这样的:
由此可以看出:
准实时是对数据时效性有一定的延迟,但是延迟小于t+1的数据,对这些数据进行监控或者统计分析 三、准实时数据的意义
离线数仓解决了各项目对于设备向物联网平台上报的大量数据的统计问题,解决了业务端对于统计类数据指标查询慢的问题。
但是这种解决也是对于t+1的数据统计的解决;对于当日数据还是需要用户请求时查询数据库进行计算;
这种方式对于简单的统计类业务还好,用户等待时间并不长;但是对于复杂的业务统计来说,对用户的体验就不友好了。
准实时数据就是将实时数据按照一定时间维度内的数据进行计算,对统计类的数据指标按这个维度提前计算出结果,存到数据库,或者直接推送到业务端;减少用户请求时的查询时间,使请求能迅速响应,增加用户体验感。
四、基于当前业务的准实时设计方案
基于当前业务,我们的数据统计类业务目前不需要小时级的统计,而是分钟级别统计居多,所以我们将准实时设计为以下这种方式:
基于以上设计方案,我们使用补全数据对业务端需求对设备指标进行十分钟级的统计;
考虑到我们是物联网项目,设备量只能是越来越多,而开窗统计这种方式对于这种十分钟级别的开窗会占用大量CPU,内存资源。我们对定时器功能进行研究调研,决定使用定时器+状态存储的方式;
1,定时器+状态的好处:
对于设备数据进行实时计算,定时输出方式;不需要缓存时间段内所有数据,不需要开窗操作,不需要占用太多内存存储窗口内的所有数据;
定时器可以灵活的进行开启关闭操作,对于离线设备,我们可以关闭定时输出,一定程度上降低了资源占用;
并且flink为了保证定时触发操作,与正常处理操作的线程安全问题,做了同步处理,在调用触发时必须要获取到锁,也就是二者同时只能有一个执行;
如果不做通不处理,当正常处理实时数据的方法会对状态进行更新操作,定时器中进行查询操作或者清空操作时,两者会发生线程安全问题
状态管理使用内存+磁盘方式,在保证程序低延时的情况下,降低了临时数据对于缓存的高占用问题;
2,定时器的局限性:
为了保证当设备离线时定时器能够闭合输出,服务采用系统时间的定时器,但是输出的数据需要以事件时间为统计维度,且数据在各服务之间是有延时的;为了保证输出的每条数据都是整十分钟的事件时间,服务定时器做了延时处理:
(1)服务器的定时输出间隔为11分钟,服务做了一分钟延时,尽可能保证时间间隔内数据的完整性
(2)当定时器输出时,系统时间为整十分钟时,该条数据不输出,会在下一个定时器输出(防止数据在各服务之间的传输,造成的数据迟到)这样就会出现数据会晚一个窗口,即22分钟后才能看到上一个十分钟的数据;
3,开发逻辑设计:
服务对补全数据进行实时消费,根据设备号做分组聚合操作;
以设备号为单元,开启定时器;
设备首次上报在线数据时,开启定时器;设备上报离线数据时关闭定时器;(这样有利于降低资源,并且避免无效数据的输出);
分组内对补全数据进行计算统计,统计时按照数据上报时间,并以整十分钟为统计节点进行输出,将结果记录到状态中;(按业务需求)
定时器输出时,获取设备存储在状态内的数据进行汇总统计输出;
输出到数据库供业务端查询;