关于吃掉物理的二次聚合无法实现的需要之旁门左道实现法

需求:
吃掉物理想要统计一下,在指定时间内,所有的吃掉物理用户(包括老师,学生,家长等),按访问次数进行一下聚合,显示每个访问次数对应的人数,可以进一步获知僵尸用户和活跃用户的个数,以后可能扩展为想知道具体是哪些人。要的报表如下:


2018-06-01至2018-09-01 (其中天表示这个用户共使用了多少天,一天使用N次记一天)


100天 56人
98天 467人
96天 3442人
...

1天 29034人

=======================================================================================================
分析与实现:

1、因es无法实现二次聚合(或者说我们不会),现在能想到的方法是不完全依赖于ES,要使用原来的技术体系与ES结合的思路实现。

2、设计一个统计任务的概念,就是说选择一段时间后,点开始统计,就分配一个统计任务(时间戳即可 chidiaowuli_20180809082230),记录到mysql中,界面上显示,现在后台统计中,请稍侯...

3、lua将任务ID,时间戳+2018_06_01-2018_09_01 写入到一个ssdb的queue中,名称为tongjifenxi_queue

4、开发一个python程序一直while true进行循环,监控到有内容,就准备开始进行统计分析,发现前缀是吃掉物理就开始吃掉物理的逻辑,后期可以扩展为支持其它业务。
如果没有找到就休息3秒。

5、将吃掉物理的用户在这段时间内访问的人员,按老师,学生,家长查三次,分别按分页读取,一次100个。这样就比直接从数据库中查询所有的吃掉物理用户优化多了,因为没访问的直接就不再统计了!

6、将100个用户,调用elasticsearch进行统计这些人在2018_06_01-2018_09_01时间范围内的访问天数。

7、获取访问天数后,将结果记录到ssdb,具体设计如下:

(1)hash记录真实情况

hashmap 名称 : chidiaowuli_acess_count_时间戳_98
key: identity_id+'_'+person_id
value: 1

(2) 需要知道哪些hashmap是这次相关的
zset name: chidiaowuli_acess_count_zset_时间戳
key : chidiaowuli_acess_count_时间戳_98
score: 每次增加一个人员访问天数时,需要首先增加hashmap的内容,然后取出 zset中相关的score并加1.

8、显示需求要的列表:直接从zset中读取即可。如果想要钻取,我们可以读取对应的hashmap.

9、垃圾回收与清理
对于以前的统计分析任务,可以删除,删除时要按mysql-->ssdb zset --> ssdb hashmap的方式找到最后的记录,删除之,然后再回退删除上一级,最终删除mysql数据。

10、至此,所有流程完成。

猜你喜欢

转载自www.cnblogs.com/littlehb/p/9440689.html