All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.junxworks.junx.stat.datawindow.SlicedBlock Maven / Gradle / Ivy

/*
 ***************************************************************************************
 * 
 * @Title:  SlicedBlock.java   
 * @Package io.github.junxworks.junx.stat.datawindow.timewindow   
 * @Description: (用一句话描述该文件做什么)   
 * @author: Michael
 * @date:   2018-7-12 20:49:28   
 * @version V1.0 
 * @Copyright: 2018 JunxWorks. All rights reserved. 
 * 
 *  ---------------------------------------------------------------------------------- 
 * 文件修改记录
 *     文件版本:         修改人:             修改原因:
 ***************************************************************************************
 */
package io.github.junxworks.junx.stat.datawindow;

import io.github.junxworks.junx.stat.datawindow.timewindow.ExpirableObject;

/**
 *  为什么要切分时间窗口?因为没有必要缓存(存储)每一条统计数据,目前统计数据是缓存在Redis集群中的,
 *  试想,在一个长度周期为5天(或者更长)的统计定义中,用户每一条统计相关数据都会被缓存在redis中,
 *  这不仅增加了网络传输压力,更浪费了redis宝贵的内存空间,因此要对时间窗口进行切分统计。
 *	对统计时间窗口内部集合进行切分,通常一个大的时间窗口,内部会被切分成小的时间窗口(SlicedBlock切分块),
 *  每个切分块本质上也是一个时间窗口,每个切分块对象都会有一个过期时间expireTime、过期时间点expireTimePoint和
 *  领跑时间pacemakerTime(下方解释),切分块是时间窗口内部的最小存储对象,统计数据到来后,会被累计到切分块中,
 *  所有切分块的累计值,才是这个统计的实际值。时间窗口在滑动的时候,让时间窗口滑动基于切分块来滑动,而不是整个
 *  窗口一次性往前滑动整个窗口,因此不会造成因为时间窗口的滑动导致统计数据误差太大。例如一个5分钟的时间窗口,
 *  我们会切分成5个一分钟的切分块,时间窗口是1分钟一分钟的滑动,这样每次滑动仍然会保留4分钟的数据。我们以策略的
 *  方式向外提供窗口切分规则(sliceStrategy),策略可以有多种实现。
 *  
 *  注释:领跑时间本质上是一个时间窗口的最大时间,和窗口的过期时间点对应,两个值决定了时间窗口的宽度。
 *  目前我们以接收到最近交易事件所在的切分块的最大时间点,作为时间窗口滑动的领跑时间,促使时间窗口产
 *  生切分块的事件我们可以称为领跑事件(pacemakerEvent),领跑事件所在的切分块的最大时间,为当前时间窗口的领跑时间。
 *  
 *  过期时间点,决定了当前时间窗口内的数据何时过期,跟领跑时间对应,这两个值决定了时间窗口宽度。
 *  
 *   注意:切分块在时间窗口内部是非连续的,是根据交易事件的发生时间动态切分的,每个切分块的时间宽度不一定是一样的,是根据窗口定义的单位动态计算出来的。

 *
 * @author: Michael
 * @date:   2017-5-19 16:25:03
 * @since:  v1.0
 */
public interface SlicedBlock extends ExpirableObject, TimeBasedDataWindow {

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy