News Feed 系统设计

2023-11-20

新鲜事系统 News Feed

• 什么是新鲜事 News Feed?
• 你登陆 Facebook / Twitter / 朋友圈 之后看到的信息流 • 你的所有朋友发的信息的集合
• 有哪些典型的新鲜事系统? • Facebook • Twitter • 朋友圈 • RSS Reader
• 新鲜事系统的核心因素? • 关注与被关注 • 每个人看到的新鲜事都是不同的

优秀的分析文章:
转:微信朋友圈的设计分析

Storage 存储 – Pull(拉) Model
• 算法• 在用户查看News Feed时,获取每个好友的前100条Tweets,合并出前100条News Feed
• K路归并算法 Merge K Sorted Arrays

• 复杂度分析
• News Feed => 假如有N个关注对象,则为N次DB Reads的时间 + N路归并时间(可忽略)
• Post a tweet => 1次DB Write的时间

为什么 N 路归并算法 的耗时可以忽略?

Storage 存储 – Pull 原理图
用户

  1. Give me News Feed
  2. Merge and return
    Web Server
  3. Get followings
  4. Get tweets from followings

Interviewer: Pull模型有什么缺陷么?

Storage 存储 – Pull Model
• getNewsFeed(request)
• followings = DB.getFollowings(user=request.user)
• news_feed = empty
• for follow in followings:
• tweets = DB.getTweets(follow.to_user, 100)
• news_feed.merge(tweets)
• sort(news_feed)
• return news_feed[:100] # 返回前100条

N次DB Reads非常慢 且发生在用户获得News Feed的请求过程中

• postTweet(request, tweet)
• DB.insertTweet(request.user, tweet) • return success

Storage 存储 – Push(推) Model
• 算法
• 为每个用户建一个List存储他的News Feed信息
• 用户发一个Tweet之后,将该推文逐个推送到每个用户的News Feed List中
• 关键词:Fanout • 用户需要查看News Feed时,只需要从该News Feed List中读取最新的100条即可

• 复杂度分析
• News Feed => 1次DB Read
• Post a tweet => N个粉丝,需要N次DB Writes • 好处是可以用异步任务在后台执行,无需用户等待

Interviewer: Push模型有缺陷么?
• getNewsFeed(request)
• return DB.getNewsFeed(request.user)
• postTweet(request, tweet_info)
• tweet = DB.insertTweet(request.user, tweet_info)
• AsyncService.fanoutTweet(request.user, tweet) – 异步执行
• return success

• AsyncService::fanoutTweet(user, tweet)
• followers = DB.getFollowers(user)
• for follower in followers:
• DB.insertNewsFeed(tweet, follower) – followers的数 目可能很大

Pull vs Push
pull模式 :客户端主动从服务端拉取消息。
优点:客户端不存在消息堆积的情况。
缺点:消息处理不及时,可能存在大量无效请求,客户端需要考虑拉取频率逻辑

push模式 :服务端主动给客户端推消息的。
优点:消息及时到达。
缺点:无法感知客户端的消费能力,可能造成客户端消息堆积

Storage 存储 – Pull vs Push
• 热门Social App的模型
• Facebook – Pull
• Instagram – Push + Pull
• Twitter – Pull
• 朋友圈 - ?

Push:当Producer 发出的消息到达后,服务端马上将这条消息投递给 Consumer。

Pull:当服务端收到这条消息后什么也不做,只是等着Consumer 主动到自己这里来读,即 Consumer 这里有一个“拉取”的动作(即为你来我就服务)。

• 误区
• 不坚定想法,摇摆不定
• 不能表现出Tradeoff的能力
• 无法解决特定的问题

• 用过前3个步骤的分析,我们已经得到了一个可行方案
• Scenario 场景 和面试官讨论 搞清楚需要设计哪些功能 并分析出所设计的系统大概所需要支持的 Concurrent Users / QPS / Memory / Storage 等
• Service 服务 • 合并需要设计功能,相似的功能整合为一个Service
• Storage 存储 • 对每个 Service 选择合适的存储结构 • 细化数据表单 • 画图展示数据存储和读取的流程
• 得到一个 Work Solution 而不是 Perfect Solution • 这个Work Solution 可以存在很多待解决的缺陷

Scale 扩展 How to Scale?
系统如何优化与维护 1. Optimize 优化 2. Maintenance 维护
Scale 扩展 - 如何优化系统

• 第一步 Step 1: Optimize
• 解决设计缺陷 Solve Problems
• Pull vs Push
• 更多功能设计 More Features • Like, Follow & Unfollow, Ads
• 一些特殊情况 Special Cases • 鹿晗关晓彤搞挂微博, 僵尸粉

• 第二步 Step 2: Maintenance
• 鲁棒性 Robust • 如果有一台服务器/数据库挂了怎么办
• 扩展性 Scalability • 如果有流量暴增,如何扩展

Scale 扩展 – 解决Pull的缺陷
• 最慢的部分发生在用户读请求时(需要耗费用户等待时间)
• 在 DB 访问之前加入Cache • Cache 每个用户的 Timeline
• N次DB请求 → N次Cache请求 (N是你关注的好友个数)
• Trade off: Cache所有的?Cache最近的1000条?

• Cache 每个用户的 News Feed
• 没有Cache News Feed的用户:归并N个用户最近的100条Tweets,然后取出结果的前100条
• 有Cache News Feed的用户༚ 归并N个用户的在某个时间戳之后的所有Tweets
• 课后作业:对比MySQL 和 Memcached 的 QPS • Memcached QPS / MySQL QPS ~ 100 ~ 1000

Scale 扩展 – 解决Push的缺陷
• 浪费更多的存储空间 Disk
• 与Pull模型将News Feed存在内存(Memory)中相比
• Push模型将News Feed存在硬盘(Disk)里完全不是个事儿
• Disk is cheap

• 不活跃用户 Inactive Users
• 粉丝排序 Rank followers by weight (for example, last login time)

• 粉丝数目 followers >> 关注数目 following
• Lady Gaga问题
• 无解?完全切换回Pull?
• Trade off: Pull + Push vs Pull

看到这里的时候,我忍不住亲了布鲁斯一口,他痛快的描述出了我一直以来在工作中说不清道不明的烦躁,因为你总会遇到这样的人,同时很难发现自己到底是不是这样的人。

我在工作前3年其实如履薄冰,感觉自己什么都学了,但去了公司发现什么都不会,怀揣着自我否定一点点完成别人布置的任务,直到工作5年以后才有一种醍醐灌顶的感觉,理解了自己做的是什么,接下来要学习哪个方向,以前学到那么多东西究竟是怎么串联起来的,这是一种打通任督二脉的满足感。

等到工作8年之后,才真正开始回头看Java语言,对以前烦厌欲呕的Java基础提起莫名的兴趣,同时喜欢看书,写案例,尝试阅读别人的源码等等,此时我才真正有自己一只腿迈进Java领域的意识。

同时,在工作中会对许多能力一般但沟通较为偏执的同事产生抵触情绪,我有时会认为这是一种大人看小孩耍脾气的感觉,这个只有在工作多年之后才会产生,作者很准确的阐述出了我描绘不出的这种解释。

同样的,我认为在这个成长的过程中,我一定也成为过别人心中眼高手低的人。
我在这里能分享给大家的经验就是,在工作中多学习少争论,多和厉害的人走近一点,虚心把对方的东西都学过来,长此以往你会进步神速,这不是你在网上学习能得到的,一定是在工作中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

News Feed 系统设计 的相关文章

随机推荐

  • 正激拓扑的复位电路

    正激拓扑的复位电路 1 杂谈 2 原理简介 3 分类 3 1 有源钳位 3 2 绕组复位 3 3 RCD复位 3 4 谐振复位 1 杂谈 我发现我有个最大的缺点是不会讲话 每次跟不熟悉的人讲话或者汇报时 就毫无逻辑 紧张的要死 被讨厌的勇气
  • Navicat设置id自增,并随时设置自增的起始值

    一 问题背景 有时候数据里面的表的id为 1 4 13 15等等 如下图 怎么重新设置自增的起始值 使它变成每个增加1 而不是散列的数 如下效果 二 解决方法 选中要修改的表 点击设计表 如下 然后点击 选项 在自动递增那里改为1即可 点击
  • 2022全国职业技能大赛-网络安全赛题解析总结④(超详细)

    2022全国职业技能大赛 网络安全赛题解析总结 自己得思路 模块A 基础设施设置与安全加固 20分 模块B 网络安全事件响应 数字取证调查和应用安全 40分 模块C CTF夺旗 攻击 20分 模块D CTF夺旗 防御 20分 有什么不懂得可
  • MATLAB实现PSO-SVM多输入单输出回归预测(粒子群算法优化支持向量机)

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • 循环 for while do..while 以及break和continue

    循环 for 双重for while dowhile continue break 一 for循环 被循环的执行语句为循环体 是否继续执行取决于终止条件语句 所以 循环语句由 循环体和循环的终止条件组成的语句 语句结构 for 初始化变量
  • 桌面怎么设置 计算机 网络连接,电脑桌面的本地连接ip地址可以设置吗_本地连接ip地址设置方法 - 驱动管家...

    1 首先在Win7桌面上找到 网络 入口 如下图 进入Win7网络 2 进入网络之后我们再点击顶部的 网络共享中心 如下图 进入Win7网络共享中心 3 进入Win7网络共享中心之后 我们再点击左侧的 更改网络适配器 如下图 选择更改网络适
  • 经典,一文讲透ESD原理和设计

    一直想给大家讲讲ESD的理论 很经典 但是由于理论性太强 任何理论都是一环套一环的 如果你不会画鸡蛋 注定了你就不会画大卫 先来谈静电放电 ESD Electrostatic Discharge 是什么 这应该是造成所有电子元器件或集成电路
  • Ubuntu20.04通过rsync和inotify实现定时备份与实时备份

    通过rsync和inotify实现定时备份与实时备份 为了避免主服务单点故障 可以将数据备份到远程备份机器 可以使用rsync工具同步Jenkins home到远程 可以利用rsync工具的 exclude from FILE 功能 定制一
  • KVM热迁移

    KVM热迁移 介绍 KVM热迁移的前提是拥有共享存储 以下通过NFS实现KVM热迁移 迁移过程 将一处于运行状态的KVM虚拟机从节点kvm 01迁移到kvm 02后继续运行 准备 主机准备 hostname IP地址 系统 配置 kvm 0
  • Docker 国内镜像地址

    http f1361db2 m daocloud io http hub mirror c 163 com https docker mirrors ustc edu cn
  • c++中的类模板

    C 的类模板为生成通用的类声明提供了一种更好的方法 模板提供参数化类型 即能够将类型名作为参数传递给接收方来建立类或者函数 一 定义类模板 include
  • IndexError: index 5 is out of bounds for axis 1 with size 5

    keras中报错 IndexError index 5 is out of bounds for axis 1 with size 5 原因 大概率是你的数据集label没有设置好 keras中数据集标签需要从0开始 并且连续 类似于下图这
  • Unity WebGL错误集锦

    ips 0 Unity的PlayerSettings的otherSettings或者Publish Settings里面的Enable Exceptions里面选择Full StackTrace 可以在打出的包中的浏览器的webgl打印出错
  • 【计算机基础

    定点数的表示 定点数 小数点的位置固定 例 996 007 常规计数 浮点数 小数点的位置不固定 例 9 96007 10 2 科学计数法 二进制的定点数 浮点数也类似 无符号数 整个机器字长的全部二进制位均为数值位 没有符号位 相当于数的
  • 关于Linux和Shell的相关书籍

    入门类 一直认为 在一个系统上学习开发之前 首先需要熟悉这个系统的使用 鉴于天朝的国情 绝大部分人第一个接触的操作系统就是Windows 因此对于这绝大部分人来说 如果要学习Linux开发 学会使用这个系统都是必不可少的一个环节 现在的Li
  • UVa 1347 Tour

    题目 Tour 题意 来自luogu John Doe想用最小的路程游览完所有目的地 每个目的地都用坐标xi yi表示 任何两目的地的xi都不相同 两目的地之间的路程是两点之间的直线距离 John是这样走的 他从最左边的点开始 然后只能向右
  • word页码如何设置为章节加页码,例如第一章第一页1-1、第二章第一页2-1

    由于用到word页码分章节 页码的形式 从网上查了一下 质量真的很差 没有一篇文章讲清楚的 有的所答非所问 一怒之下 利用几个小时的时间解决问题并写下这篇文章 以供大家学习参考 1 word插入页码 选择包含章节号 1 1 双击页脚 点击插
  • 55黑马QT笔记之关闭子线程

    55黑马QT笔记之关闭子线程 1 这里为什么要单独写多一篇文章来说线程的关闭呢 主要是想让大家提升印象 养成资源回收的好习惯 任何时候都要想起开辟过的内存回收 这里的关闭子线程上一篇也写到了 就是利用关闭窗口时调用槽函数回收掉 2 具体步骤
  • 2023最新ChatGPT网站源码+支持GPT4+Ai绘画+用户会员套餐+邀请分佣功能+支持后台一键更新+永久更新!

    2023最新ChatGPT网站源码 支持GPT4 Ai绘画 用户会员套餐 邀请分佣功能 支持后台一键更新 永久更新 可同时 单独 开启或者关闭GPT3 5和GPT4 0两种ChatGPT提问模型 用户可切换 次数套餐也是分开的 支持手机电脑
  • News Feed 系统设计

    新鲜事系统 News Feed 什么是新鲜事 News Feed 你登陆 Facebook Twitter 朋友圈 之后看到的信息流 你的所有朋友发的信息的集合 有哪些典型的新鲜事系统 Facebook Twitter 朋友圈 RSS Re