Feed,在社交和信息推荐的App与网站中,基本都会用到的。例如常用的新浪微博,用户登录进入后,展现给我们的就是feed信息流。新浪微博的信息,来自于你关注人所发布的内容。还有微信的朋友圈,今日头条的信息流,好友发布的美拍等,这些都是Feed。玩过知乎的人应该知道,在知乎Feed中,会显示某某关注了某某话题,某某点赞或者赞同了某个回答。广义来讲,这些也算是一种Feed。

本文会先介绍几种不同的Feed设计,让大家对Feed实现有初步的了解。其次会对我们采用的Feed方案作出详细的解答。

推方式

推方式,是发生在用户触发行为(发布新的动态,关注某个人,点赞)的时候。在触发时,用户的自身行为会记录到对应的行为表中,其次用户的行为也会记录到自己的粉丝对应动态表中。

  1. 用户A发布新的帖子(动态),帖子记录到帖子表(主表)中。
  2. 发帖行为塞到队列(Redis List)中。触发异步操作,消费者会先读取用户的粉丝列表(uid分表),依次写入到用户的动态表(uid分表)中。
  3. 前端读取用户动态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流的设计与实现相关推荐

  1. 一种非Timeline的feeds流架构

    摘要: 有如下一个场景: 用户关注的都是大V,用户看到的feeds流内容,会根据大V的发帖数目.帖子被转发数目.大V活跃指数等规则,进行打分计算排序后展示:且计算的内容有一个时间窗口(比如只计算最近7 ...

  2. 如何开发一个Feeds流系统——写扩散模式为例

    一.了解Feeds流 在学习如何开发Feeds流应用前,我们需要先了解什么是Feeds流. 1. 什么是Feeds流 Feeds流是一个持续更新并展示给用户的信息流.它将用户主动订阅的若干消息源组合在 ...

  3. 魅族大数据之流平台设计部署实践--转

    原文地址:http://mp.weixin.qq.com/s/-RZB0gCj0gCRUq09EMx1fA 沈辉煌   魅族数据架构师  2010年加入魅族,负责大数据.云服务相关设计与研发: 专注于 ...

  4. 不固定图片宽高瀑布流_APP设计学习:瀑布流式的产品UI设计

    看到好的APP产品UI设计,真是忍不住想要停留几秒,慢慢来欣赏.今天学堂君收集了近期不错的优质的APP设计作品,看起来极舒服的UI界面,分享给大家.这一期的重点学习:在APP界面设计当中,如何应用瀑布 ...

  5. 旋流式沉砂池计算_旋流沉砂池设计方法

    旋流沉砂池设计接口条件和主要参数 设计旋流沉砂池前要确认的接口条件和信息包括: 地质.气候等基本设计条件: 可用地尺寸及在总图的位置坐标: 地坪标高,上下游水位或范围,冻土层高度,管道覆土小深度要求: ...

  6. 产品引流如何设计引流诱饵?引流如何选择诱饵?

    产品引流如何设计引流诱饵?引流如何选择诱饵? 做企业的老板是不是会去投放电视广告,路牌广告,地铁广告,互联网广告,朋友圈广告等等-结果,钱砸下去以后,粉丝都不一定会去买你们的账. 那小老板呢?印传单, ...

  7. 做产品引流如何设计引流诱饵?引流核心的步骤是什么?

    做产品引流如何设计引流诱饵?引流核心的步骤是什么? 引流是什么? 1.引流是,最大化传播实用性的内容. 2.引流是捕鱼的过程,而不是钓鱼的过程. 3.捕鱼=设计鱼饵+选择渔网+鱼塘撒网 4.引流的本质 ...

  8. 质子交换膜燃料电池流场设计(节选自课程设计作业)

    质子交换膜燃料电池流场设计 3.2 仿真建模 3.2.1 几何 3.2.2 物理场设置 4 结果与讨论 4.1 流道长度与宽度 4.2 两段进料流场分布规律 4.3 多段进料PEMFC结构设想 总结 ...

  9. 旋流式沉砂池计算_旋流沉砂池设计计算.doc

    旋流沉砂池设计计算 钟式旋流沉砂池 设备结构及工作原理: 该套设备由叶轮.转动轴.电动机.减速器和吸砂系统等部分组成:另外在排沙管与砂泵之间安装一个闸阀,砂泵出口处用管道链接至砂水分离器上部进水口. ...

最新文章

  1. 探索未知种族之osg类生物---起源
  2. .net mysql 备份_windows mysql 自动备份的几种方法
  3. osx doc to html,macos – 在OSX上安装Git HTML帮助
  4. JavaFX真实世界应用程序:EIZO CuratOR Caliop
  5. PHP用gd库给图片添加水印,php用GD库给图片添加水印
  6. 从民办三本到知名企业感知算法工程师
  7. 松下机器人找原点步骤_桁架机器人在汽车座椅安装生产线中的应用
  8. android EditText使用指南
  9. oracle设置优化update,oracle update优化
  10. FaceBook到底验证个啥?
  11. 计算机课小组主题作业,小组作业软件工程课程设计(选作).doc
  12. 大数据工程师要学的编程_每个数据工程师都应了解的ml编程技巧,第2部分
  13. 生成自签名证书:生成证书和秘钥
  14. 阿里云ECS建站教程(超详细图文教程)
  15. 关于CLASS , SEL, IMP的说明
  16. OSPF骨干区域和非骨干区域通信
  17. GPS授时模块:UTC时间,GMT,GPS时,北斗时,北京时间及其关系
  18. 基于FME实现不动产数据一键导出自然资源部汇交格式
  19. 刺激前低的EEG alpha功率增强了视觉知觉,但不是视觉知觉敏感度
  20. 让DIV内部内容撑开外层的div方法

热门文章

  1. 地质灾害监测的主要内容
  2. AntV L7地图可视化入坑笔记
  3. PowerDesigner导出数据库表结构word
  4. vue项目中使用高德地图行政区域聚合功能(script引入方式)
  5. php 转化为英文月份,php怎么实现月份数字转英文
  6. python视频点播系统_精通Python(微课视频版)/Python开发视频点播大系
  7. 深入谈谈Web3重塑数据价值的意义
  8. 6000分“无聊大师”——张小龙
  9. Mysql实现for循环遍历
  10. 如何添加centos7系统的字体及编码格式?