系统设计实例(二)新闻订阅系统

新闻订阅系统的设计和实现

  • Web 服务器:Web 服务器将流量重定向到不同的内部服务。
  • Post 服务:在数据库和缓存中持久化帖子。
  • Fanout 服务:将新内容推送到朋友的新闻订阅中。新闻订阅数据存储在缓存中以便快速检索。
  • 通知服务:通知朋友新内容可用,并发送推送通知。

img

Web 服务器

除了与客户端进行通信,Web 服务器还执行身份验证和速率限制。只有使用有效的 auth_token 登录的用户才能发布帖子。系统限制用户在一定时间内可以发布的帖子数量,这对于防止垃圾邮件和恶意内容至关重要。

扩散服务

扩散是将帖子传递给所有朋友的过程。有两种类型的扩散模型:写时扩散(也称为推送模型)和读时扩散(也称为拉取模型)。

  1. 从图数据库获取朋友ID。图数据库适合管理朋友关系和朋友推荐。有兴趣了解更多关于这个概念的读者,可以参考参考资料[2]。
  2. 从用户缓存获取朋友信息。然后系统根据用户设置过滤朋友。例如,如果你屏蔽了某人,即使你们仍然是朋友,她的帖子也不会出现在你的新闻订阅中。帖子可能不显示的另一个原因是,用户可能选择性地与特定朋友分享信息,或者从其他人那里隐藏信息。
  3. 将朋友列表和新帖子ID发送到消息队列。
  4. 扩散工作器从消息队列获取数据,并将新闻订阅数据存储在新闻订阅缓存中。你可以将新闻订阅缓存看作是一个 映射表。每当发布一个新帖子,它都会被添加到图 11-6 中显示的新闻订阅表中。如果我们在缓存中存储整个用户和帖子对象,内存消耗可能会变得非常大。因此,只存储ID。为了保持内存大小小,我们设置了一个可配置的限制。用户在新闻订阅中浏览成千上万的帖子的机会很小。大多数用户只对最新的内容感兴趣,所以缓存未命中率很低。
  5. 在新闻订阅缓存中存储 。图 11-6 显示了缓存中的新闻订阅的样子。

img

写时扩散:在这种方法中,新闻订阅在写入时预先计算。新帖子发布后立即发送到朋友的缓存。

## 优点:
- 新闻订阅是实时生成的,可以立即推送给朋友。
- 因为新闻订阅在写入时就预先计算,所以获取新闻订阅非常快。
## 缺点:
- 对于明星用户来说,获取朋友列表并为他们所有人生成新闻订阅是缓慢且耗时的。这就是所谓的热键问题。
- 对于不活跃的用户或者很少登录的用户,预先计算新闻订阅会浪费计算资源。

读时扩散: 在读取时生成新闻订阅,这是一个按需模型。用户加载主页时,会拉取最近的帖子。

## 优点:
- 对于不活跃的用户或者很少登录的用户,读时扩散效果更好,因为它不会在他们身上浪费计算资源。
- 数据不会推送给朋友,所以没有热键问题。
## 缺点:
- 获取新闻订阅速度慢,因为新闻订阅没有预先计算。

**混合扩散:**由于快速获取新闻订阅很关键,所以我们对大部分用户使用推送模型。对于那些有许多朋友/粉丝的名人或用户,我们让粉丝按需拉取新闻内容,以避免系统过载。

新闻获取服务
  • 网络服务器调用新闻订阅服务获取新闻订阅。
  • 新闻订阅服务从新闻订阅缓存获取帖子 ID 列表。
  • 新闻订阅服务从缓存(用户缓存和帖子缓存)中获取完整的用户和帖子对象,以构建完全填充的新闻订阅。
  • 完全填充的新闻订阅以 JSON 格式返回给客户端进行渲染。

img

新闻缓存结构设计
  • 新闻订阅:存储新闻订阅的 ID。
  • 内容:存储每个帖子的数据。热门内容存储在热缓存中。
  • 社交图:存储用户关系数据。
  • 行动:存储用户是否喜欢一篇帖子,回复一篇帖子,或对一篇帖子进行其他操作的信息。
  • 计数器:存储点赞、回复、关注者、正在关注等的计数器。

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/475805.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设置客户端桌面壁纸 文件夹重定向

域策略-设置客户端桌面壁纸 1/服务器管理器组策略管理-gwy.com-Defait Domain Policy-右击编辑 2/用户配置-首选项-置windows设置-文件夹-右击文件夹-创建-C:\bgp-应用 3/在客户端策略更新-gpupdate /force 命令符-查看是否正确 4/服务器创建c:\image\R-C.jpg,共享文…

【什么是Internet?网络边缘,网络核心,分组交换 vs 电路交换,接入网络和物理媒体】

文章目录 一、什么是Internet?1.从具体构成角度来看2.从服务角度来看 二、网络结构1.网络边缘1.网络边缘:采用网络设施的面向连接服务1.1.目标:在端系统之间传输数据1.2.TCP服务 2.网络边缘:采用网络设施的无连接服务2.1目标&…

Zotero引入英文参考文献作者都是大写字母问题

修改之前是这样的: 修改过程 进入word 打开样式编辑器 打开后,找到这里: 删除 text-case“uppercase” 就可以实现这个样式: 然后我们点击保存,将这个样式文件另存为,然后替换掉原来的文件 源文件在 …

算法详解——Dijkstra算法

Dijkstra算法的目的是寻找单起点最短路径,其策略是贪心加非负加权队列 一、单起点最短路径问题 单起点最短路径问题:给定一个加权连通图中的特定起点,目标是找出从该起点到图中所有其他顶点的最短路径集合。需要明确的是,这里关心…

技巧 获取指定文件夹下的所有文件名称

一. powershell脚本 当一行命令太长的时候,使用反引号 来换行 # 设置要扫描的文件夹路径 $folderPath "E:\mp3"# 构建输出文件的完整路径,将结果输出到桌面上的all_file_name.txt文件中 $outputFilePath [System.IO.Path]::Combine([System.Environm…

档案著录员好干吗

档案著录员是负责对档案资料进行著录、整理和管理的专业人员。他们的工作主要包括: 1. 著录档案资料:根据相关规范和标准,对档案资料进行详细的著录,包括档号、题名、日期、责任者、关键词等信息,以便于后续的检索和利…

缅甸的大开发时代即将到来 缅文wordpress主题模板

Simplify WordPress外贸网站模板 Simplify WordPress外贸网站模板,简洁实用的外贸公司wordpress外贸建站模板。 https://www.jianzhanpress.com/?p4565

蓝桥杯(2):python基础算法【下】

贪心、双指针、二分 11 贪心 11.1 定义 11.2 适用情况 如何判断???! 11.3 实例 11.3.1 石子合并 只考虑一步,每次都找最小的 那么问题的核心就是:如何选出最小的! #石子合并 import heapqn…

Pytorch神经网络-元组/列表如何喂到神经网络中

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️感谢大家点赞👍&…

GPT2从放弃到入门(二)

引言 本文介绍如何利用GPT2从零训练一个多轮对话聊天机器人,按照本文的思路可以轻松地训练自己的数据。 数据处理 ⚠️ 这是本文的核心部分,其他的内容甚至可以不用看。 本小节阐述多轮对话数据的处理。 数据来自网上的一份开源数据:htt…

【c++入门】命名空间,缺省参数与函数重载

🔥个人主页: Quitecoder 🔥专栏:c笔记仓 朋友们大家好!本篇内容我们进入一个新的阶段,进入c的学习!希望我的博客内容能对你有帮助! 目录 1.c关键字2.第一个c代码3.命名空间3.1 nam…

Linux - 线程互斥和互斥锁

文章目录 前言一、为什么要线程互斥原子性 二、互斥锁互斥锁的创建与销毁互斥锁进行互斥 前言 前几节课,我们学习了多线程的基础概念,这节课,我们来对线程互斥和互斥锁的内容进行学习。 一、为什么要线程互斥 首先我们要明白,对…

AOP切面编程

1.基本概念: AOP(Aspect-Oriented Programming,面向切面编程),跟oop面向过程编程相对,AOP一般用于将公共逻辑和业务逻辑进行拆分,可以减少代码间的耦合性。 有道翻译:AOP—面向切面…

jsp2024.3.21(4) html基础

一、实验目的 1、html 文件的基本结构&#xff1b; 2、html 的常用标记&#xff1b; <HTML> <HEAD> …… </HEAD> <BODY> …… </BODY> </HTML> 二、实验项目内容&#xff08;实验题目&#xff09; HTML常用标记 1&#xff0e;<…

C语言数据在内存中的存续:一篇文章让你秒懂基础!

JAMES别扣了-CSDN博客 &#x1f495;在校大学生一枚。对IT有着极其浓厚的兴趣 ✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享. &#x1f60d;希望我的文章对大家有着不一样的帮助&#xff0c;欢迎大家关注我&#xff0c;我也会回关&#xff0c;大家一起交…

LeetCode 热题 100 | 堆(一)

目录 1 什么是堆排序 1.1 什么是堆 1.2 如何构建堆 1.3 举例说明 2 215. 数组中的第 K 个最大元素 2.1 子树大根化 2.2 遍历所有子树 2.3 弹出栈顶元素 2.4 完整代码 菜鸟做题&#xff0c;语言是 C 1 什么是堆排序 1.1 什么是堆 堆的定义和分类&#xff…

为什么Hashtable不允许插入nuIl键和null值?

1、典型回答 浅层次的来回答这个问题的答案是&#xff0c;JDK 源码不支持 Hashtable 插入 value 值为 null&#xff0c;如以下 JDK 源码所示&#xff1a; 也就是 JDK 源码规定了&#xff0c;如果你给 Hashtable 插入 value 值为 null 就会抛出空指针异常。 并且看上面的 JDK …

如何搭建DolphinScheduler服务并结合内网穿透公网远程任务调度

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

Stable Diffusion WebUI 生成参数:宽度/高度/生成批次/每批数量/提示词相关性/随机种子

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文将继续了解 Stable Diffusion WebUI 的生成参数&#xff0c;主要内容有&#xff1a;宽度、高度、生成批次、每批数量、提示词相关性、随机种子。希望能对你…

大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 并训练自己的数据集

大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 概述 大模型微调(finetuning)以适应特定任务是一个复杂且计算密集型的过程。本文训练测试主要是基于主流的的微调方法:LoRA、Adapter、Prefix-tuning、P-tuning和Prompt-tuning,并对…