一个交互统计需求记录

好久没有写文章了,这篇介绍一个工作中遇到的功能和相关设计,其中涉及到的几个点还是值得深入考虑下,简单做个记录。

业务场景

实际是一个数据统计的需求,比如我们在使用微博的时候,会记录有多少人评论,发布多少评论,收到多少评论等交互信息。与之类似,这个需求详细描述的话有如下5个指标要提供。
1、用户发布的内容数;
2、用户内容得到的分享数
3、用户分享的内容数;
4、用户给他人的评论数;
5、用户内容获得的评论数;

概要设计

问题一

用户发布的内容数
首先,第一个用户发布的内容数,这个其实只要在用户发布的时候做记录就可以了。这个是一种基础的方案,另外有一种场景是,这个发布的内容需要审核。内容只记录有效内容,这个场景下,有三种解决方法:1)如果有消息组件,在完成审核之后推送消息来统计。2)没有消息组件或者不完善可以用借口回调做统计。3)比较笨拙的方法,固定时间后主动调用接口获得统计数据。但是会有问题,审核如果是人工的,往往不会是固定周期完成,因此不推荐。操作其实就是分享之后给authorId 对应的pub_count+1。

问题二

用户内容获得的分享数
这里俩问题,计数的是内容还是分享的人次,是否需要去重。这里我们看下,首先有三个关键参数,内容ID,分享者,内容作者,即contentId,sharedBy,authorId。用户内容获得的分享数,假设去重,就用 sharedBy + contentId 判断是否已经分享,否则设置标签并给对应的authorId的recv_shared_count + 1。当然这里如果是记录分享人次,则用authorId + sharedBy去重,效果就是只要用户A分享过B的内容,就算一人次计数,且以后再分享都不算。

问题三

用户分享的内容数
这个比较简单,用sharedBy + contentId做去重,然后按结果给对应的sharedBy的shared_count+1

问题四

用户给他人的评论数
这个是比较复杂的一个功能,有很多的情况。首先,评论一般是在一个内容下的,回复内容算作一级评论,当然还有回复评论,会有多级的评论回复。如果是统计人次,还有个场景就是A发内容,B评论A,C评论B的评论,这种情况到底算给谁的评论,这里我们默认也算作给A的评论,因为都是在A的内容下。还有一种比较特殊就是,在别人的内容下自己回复自己的评论是不是要计数,虽然这个情况比较少,其实也可以加但可能会有hash key 放大的风险,因为又增加了一个维度的统计。
这个还是内容的评论数,不是用户评论了多少人,还是以内容来判断的。首先,发布评论之后,有几个参数:内容id,评论者,内容作者,即contentId,commenter,authorId,首先用authorId和commenter过滤自己给自己的评论。其次给对应的commenter的comment_count + 1

问题五

用户内容获得评论数
这个还是以内容计数的,在评论的时候会有三个参数,评论者,内容作者,内容id,即commenter,authorId,contentId,首先过滤自己给自己内容评论(他人内容下自己回复自己评论不过滤),最后给对应的authorId的recv_comment_count+1。

技术选型和设计

具体要使用哪种技术,其实是和业务紧密相关的。首先我们可以看到类似exist和incr的操作,直观的是使用Redis,但Redis涉及到集群维护以及持久化的问题,如果有成熟的环境可以直接来用就方便了。持久化除了依赖Redis当然也可以自己维护,比如用任务刷到数据库等等。其次可以考虑MySQL持久化,如唯一键等特性,当然也可以自己维护逻辑关系。其他比如Pegasus等也可以使用。
聪明的同学已经看到给别人评论和收到评论,以及分享别人内容和获得分享是有关联的。的确设计的时候这两种情况是在一起考虑的。以下是整体的设计方案和伪代码。
1、结构

   pub_count;  //发布内容数
   shared_count;//分享内容数
   comment_count;//发布评论数
   recv_comment_count;//内容获得评论数
   recv_shared_count;//内容获得分享数
}

2、业务伪代码

incrPubCount(authorId){
    incr(authorId+pub_count);
}
incrSharedCount(sharedBy,authorId,contentId){
    if(exist(sharedBy+contentId) || sharedBy == authorId){
      return;
   }else{
      set(sharedBy+contentId);
      incr(sharedBy+shared_count);
      incr(authorId+recv_shared_count);
   }
}
//具体按人次还是按内容依据情况修改。
incrCommentCount(commenter,authorId,contentId){
       if(authorId == commenter){
             return;
       }else{
           incr(commenter+comment_count);
           incr(authorId+recv_comment_count);
       }
}

总结

以上就是回顾的所有内容,某些方面还是有待完善,比如数据量非常大的时候的存储选型;某些异常的时候状态可能不一致的问题,如:A分享B,A分享计数增加,但B获得分享计数增加失败的情况。这种问题其实非常典型,类似银行转账的,只是这个是两边都增加。也因为业务不需要这么严谨,而且主要是每个具体操作比较简单,可以看做是原子的,依赖服务失败几率比较小,失败后再重试或者回滚成功的可能也比较小,因此没有再做更复杂的容错方案。感兴趣的朋友可以再深入了解下一致性相关内容。
还有一个是这个需求统计相关,可以用异步流程实现,如spring的async注解,以后有时间单独开篇文章介绍下。
以上,感谢阅读。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容