1、A流和B流时间相隔较短,几分钟或者几小时
①策略:直接使用join操作
②解释:join底层走的是:A来B没来,A会缓存起来(默认1.5天),B流来去缓存查A,join成功,然后输出。
③注意点:如果是A left join B ,A来B没来A会先输出一条没join上的数据,B来的时候会将之前的输出做逻辑撤回,然后将join上的最新结果重新输出(下游要做好过滤等操作,保证输出的幂等性)
2、A流和B流相隔时间较长,比如订单流这种以若干天为变化周期的数据
①比如要给订单实时流添加相关的维度信息
②策略:采用双流join的话需要对缓存设置较长的TTL,而且TTL没有很明确的时间标准,所以采用双流join不是一种很好的选择。
采用持久化的缓存方式,比如将订单流要join的数据缓存到hbase这种数据库,即使订单过了N天再到来,也是可以关联上的。
③注意点:这种策略时为了解决双流join的短板,缓存到habse或者redis要调研好两条流的数据明细以及何时的保存时间
3、 涉及到状态回退的实时聚合操作
①场景比如:按地区实时统计当天的有效订单数,一方面要维护以地区为key的聚合结果,另一方面要维护订单的状态,根据状态去做key的加减操作
② 策略:第一步:将订单对应的多个有效态和无效态分别映射为一个有效态和无效态,便于下一步处理。第二步:将订单以orderId为key,status为value存在habse,如果某个地区来了一条状态为有效的订单,一方面维度habse该订单的状态,另一方面对比如保存在redis的key执行+1的操作。如果来了定单取消的状态,那么同样去更新hbase该订单的状态和redis对应的地区的key的做-1操作。