Feeds流的设计与实现
Feed,在社交和信息推荐的App与网站中,基本都会用到的。例如常用的新浪微博,用户登录进入后,展现给我们的就是feed信息流。新浪微博的信息,来自于你关注人所发布的内容。还有微信的朋友圈,今日头条的信息流,好友发布的美拍等,这些都是Feed。玩过知乎的人应该知道,在知乎Feed中,会显示某某关注了某某话题,某某点赞或者赞同了某个回答。广义来讲,这些也算是一种Feed。
本文会先介绍几种不同的Feed设计,让大家对Feed实现有初步的了解。其次会对我们采用的Feed方案作出详细的解答。
推方式
推方式,是发生在用户触发行为(发布新的动态,关注某个人,点赞)的时候。在触发时,用户的自身行为会记录到对应的行为表中,其次用户的行为也会记录到自己的粉丝对应动态表中。
- 用户A发布新的帖子(动态),帖子记录到帖子表(主表)中。
- 发帖行为塞到队列(Redis List)中。触发异步操作,消费者会先读取用户的粉丝列表(uid分表),依次写入到用户的动态表(uid分表)中。
- 前端读取用户动态Feed,使用过滤条件,读取用户的动态表(关联查询帖子表)。
使用推方式,对需求变更是易适应的。为什么这么说呢?因为用户每一次的行为,我们都有存储相应的数据(数据模型)。即使变更,只需更改逻辑层代码。另外性能较好,后台数据已经准备好了,无需复杂的SQL查询。当然这样做,也存在很多弊端。1. 如果在用户A发完动态后,其粉丝B取消关注了A。在这个时间差内,内容已经推送给粉丝B了。2. 数据量存储成本较大,假如一个用户的粉丝数是100万,在发帖后会写入100万条数据。
拉方式
拉方式,是发生在粉丝拉取Feed时。粉丝拉取自己的动态,首先会检索自己的关注用户(uid分表)。得到关注的uid之后,再根据uid去查询关注用户发布的帖子。
拉的模式相对是比较简单易实现的,另外对用户关系变更(新增,删除用户)是敏感的。其次也不存在数据存储压力。但在查询的时候,对帖子表本身压力是很大的。尤其是用户本身关注的人很多的话,会有很严重的性能问题。
拉方式优化-伪实时拉取
用户在登录APP时,会发送用户活跃态到服务端。活跃信号塞到队列中,消费者依次读取活跃态uid,得到用户的关注者列表。得到关注者列表后,会去帖子表,查询关注人的发布的帖子。写到用户自己的Feed中。
这种方式和对拉方式而言,能有效避免接口性能问题,相当于通过定时任务提前把用户的动态Feed跑出来。和推方式比较,推是比较盲目的,这种方式只需针对活跃用户即可,能避免存储浪费。缺点在于实时性不好,用户登录APP后马上进入自己的Feed页,此时如果后台用户动态还没跑完,接口读取的就是历史数据了。当然这种方式不适合知乎,微博这种类型的APP的。
拉方式优化-分区拉取
分区拉取,是为了避免频繁查询单一帖子表所采用的一种优化手段。通过对帖子按照时间片分表,每次查询都能均摊到不同的表中,以此减轻主表的压力。
推方式优化-定时推
定时推,是以常驻进程的方式读取用户的发帖行为,再批量写入到粉丝的动态表中。这种方式和推方式差不多,只不过可以对多个发帖行为做聚合。
推方式优化-特定用户推
特定用户推,是推方式的一种优化方法。用户发送帖子时,只对活跃的粉丝用户写入。当然活跃用户的判定策略,是需要商定的。
综合
以上几种方案,都有自己的利弊和适用场景。选择最适合自己的就是最好的。最后,我们采用了伪实时拉取这种方式。因为我们的需求是对点赞用户的聚合展示,类似于下图知乎这种。
本身点赞行为会存储在两种类型的表(以帖子ID的点赞分表,以用户ID的点赞分表)中,如果单纯以拉方式话,会比较难处理的,而且有性能问题。其次,点赞这个行为的重要程度还不足以我们批量去存储的。
gglinux原文地址-转载请附带
Feeds流的设计与实现相关推荐
- 一种非Timeline的feeds流架构
摘要: 有如下一个场景: 用户关注的都是大V,用户看到的feeds流内容,会根据大V的发帖数目.帖子被转发数目.大V活跃指数等规则,进行打分计算排序后展示:且计算的内容有一个时间窗口(比如只计算最近7 ...
- 如何开发一个Feeds流系统——写扩散模式为例
一.了解Feeds流 在学习如何开发Feeds流应用前,我们需要先了解什么是Feeds流. 1. 什么是Feeds流 Feeds流是一个持续更新并展示给用户的信息流.它将用户主动订阅的若干消息源组合在 ...
- 魅族大数据之流平台设计部署实践--转
原文地址:http://mp.weixin.qq.com/s/-RZB0gCj0gCRUq09EMx1fA 沈辉煌 魅族数据架构师 2010年加入魅族,负责大数据.云服务相关设计与研发: 专注于 ...
- 不固定图片宽高瀑布流_APP设计学习:瀑布流式的产品UI设计
看到好的APP产品UI设计,真是忍不住想要停留几秒,慢慢来欣赏.今天学堂君收集了近期不错的优质的APP设计作品,看起来极舒服的UI界面,分享给大家.这一期的重点学习:在APP界面设计当中,如何应用瀑布 ...
- 旋流式沉砂池计算_旋流沉砂池设计方法
旋流沉砂池设计接口条件和主要参数 设计旋流沉砂池前要确认的接口条件和信息包括: 地质.气候等基本设计条件: 可用地尺寸及在总图的位置坐标: 地坪标高,上下游水位或范围,冻土层高度,管道覆土小深度要求: ...
- 产品引流如何设计引流诱饵?引流如何选择诱饵?
产品引流如何设计引流诱饵?引流如何选择诱饵? 做企业的老板是不是会去投放电视广告,路牌广告,地铁广告,互联网广告,朋友圈广告等等-结果,钱砸下去以后,粉丝都不一定会去买你们的账. 那小老板呢?印传单, ...
- 做产品引流如何设计引流诱饵?引流核心的步骤是什么?
做产品引流如何设计引流诱饵?引流核心的步骤是什么? 引流是什么? 1.引流是,最大化传播实用性的内容. 2.引流是捕鱼的过程,而不是钓鱼的过程. 3.捕鱼=设计鱼饵+选择渔网+鱼塘撒网 4.引流的本质 ...
- 质子交换膜燃料电池流场设计(节选自课程设计作业)
质子交换膜燃料电池流场设计 3.2 仿真建模 3.2.1 几何 3.2.2 物理场设置 4 结果与讨论 4.1 流道长度与宽度 4.2 两段进料流场分布规律 4.3 多段进料PEMFC结构设想 总结 ...
- 旋流式沉砂池计算_旋流沉砂池设计计算.doc
旋流沉砂池设计计算 钟式旋流沉砂池 设备结构及工作原理: 该套设备由叶轮.转动轴.电动机.减速器和吸砂系统等部分组成:另外在排沙管与砂泵之间安装一个闸阀,砂泵出口处用管道链接至砂水分离器上部进水口. ...
最新文章
- 探索未知种族之osg类生物---起源
- .net mysql 备份_windows mysql 自动备份的几种方法
- osx doc to html,macos – 在OSX上安装Git HTML帮助
- JavaFX真实世界应用程序:EIZO CuratOR Caliop
- PHP用gd库给图片添加水印,php用GD库给图片添加水印
- 从民办三本到知名企业感知算法工程师
- 松下机器人找原点步骤_桁架机器人在汽车座椅安装生产线中的应用
- android EditText使用指南
- oracle设置优化update,oracle update优化
- FaceBook到底验证个啥?
- 计算机课小组主题作业,小组作业软件工程课程设计(选作).doc
- 大数据工程师要学的编程_每个数据工程师都应了解的ml编程技巧,第2部分
- 生成自签名证书:生成证书和秘钥
- 阿里云ECS建站教程(超详细图文教程)
- 关于CLASS , SEL, IMP的说明
- OSPF骨干区域和非骨干区域通信
- GPS授时模块:UTC时间,GMT,GPS时,北斗时,北京时间及其关系
- 基于FME实现不动产数据一键导出自然资源部汇交格式
- 刺激前低的EEG alpha功率增强了视觉知觉,但不是视觉知觉敏感度
- 让DIV内部内容撑开外层的div方法