《亿级流量系统架构设计与实战》第十二章 评论服务

news2024/9/23 3:34:02

评论服务

    • 一、概述
    • 二、单级评论模式
      • 1、模型设计
      • 2、分库分表必要性
      • 3、高并发问题
    • 三、二级评论模式
      • 1、模型设计
      • 2、评论审核与状态
      • 3、按照热度排序
      • 4、评论读取流程图
      • 5、架构总览
    • 四、盖楼评论模式
      • 1、数据库递归查询
      • 2、数据库保存完整楼层
      • 3、图数据库

内容总结自《亿级流量系统架构设计与实战》

一、概述

评论作用:

  1. 增加社交互动
  2. 促进用户的参与和分享
  3. 促进用户生成内容
  4. 增加社交产品的流量

评论具备能力:

  1. 发布评论
  2. 删除评论
  3. 点赞评论
  4. 拉取内容评论列表
  5. 拉取用户评论列表
  6. 运营评论

评论模式:
  1. 单级评论模式
  2. 二级评论模式
  3. 盖楼评论模式



二、单级评论模式

1、模型设计

表名:comment

字段名类型含义
idbitint主键
content_idbitint内容id,代表评论区内容唯一标识
comment_idbitint评论id
user_idbitint评论发布者id
reply_user_idbitint如果时回复评论,则给出被回复的用户id,默认值为0
reply_comment_idbitint如果评论是回复,则给出被回复的评论id,默认值为0
comment_timedatetime评论发布时间

索引:

  1. idx_user_list(user_id,comment_time)
  2. idx_comment_list(content_id,comment_time)

2、分库分表必要性

由于受限于分库分表的必要性,我们无法选择出合适的字段作为路由依据。我们可以进行数据表冗余设计:创建两个结构与comment数据表的结构完全一致的数据表content_comment和user_comment,前者将idx_comment_list(content_id,comment_time)作为索引,将content_id作为分库分表的路由依据;后者将idx_user_list(user_id,comment_time)作为索引,将user_id作为分库分表的路由依据。当查询某内容的评论列表时,评论服务会查询content_comment数据表;当查询某用户的评论列表时,评论服务则会查询user_comment数据表。


当用户发布评论、删除评论时,要同时更新content_id和user_comment这两个数据表。为了保证这两个数据表的数据一致性,我们可以选择content_comment作为主表,而user_comment数据表通过伪从技术自动同步最新的评论数据


3、高并发问题

评论是一个高并发读&高并发写的场景。

高并发读:

  1. 异步写
  2. 写聚合

高并发读:

这里的高并发读评论,特指拉取热门内容的评论列表。对于绝大部分用户来说,其拉取的评论列表是位于评论区的前几页的那些评论。所以可以为评论列表中的前N条评论构建Redis缓存。使用Redis的ZSET结构来优化,其中Key为内容ID,Member为评论ID,Score为评论发布时间。




三、二级评论模式

1、模型设计

评论元信息表:

字段名类型含义
idbitint主键
content_idbitint内容id,代表评论区内容唯一标识
comment_idbitint评论id
user_idbitint评论发布者id
root_idbitint如果评论是对内容的评论,则该字段值为内容ID;如果评论是一级评论下的评论,则该字段值为一级评论
leveltinyint评论等级(1:一级评论;2:二级评论)
reply_countbitint此评论被回复次数,仅一级评论需要记录
like_countbitint此评论被点赞次数
reply_user_idbitint如果评论是对内容的评论,则该字段值为0;如果评论是对某条一级评论的回复,则该字段值为此一级评论的用户ID;如果评论是对某条二级评论的回复,则该字段值为二级评论的用户ID
reply_comment_idbitint如果评论是对内容的评论,则该字段值为0;如果评论是对某一条评论的回复,则该字段值为一级评论ID;如果评论是对某条二级评论的回复,则该字段值为此二级评论ID
comment_timedatetime评论发布时间

索引:

  1. idx_comment_list(root_id,level,comment_time):获取内容的评论区和某条评论的二级评论区的评论列表
  2. idx_user_comment(user_id,comment_time):用于获取用户的历史评价

2、评论审核与状态

可参考之前的内容发布系统


3、按照热度排序

热度评判维度:

  1. 点赞数
  2. 回复数
  3. 点赞数与回复数加权

对于按照热度排序的评论列表,有如下几个重点要说明:

  1. 按照热度排序,并不意味着一个评论区中的所有评论都遵循此规则。当我们打开评论区时,首先展示的是热度排名前1000(示例值)的评论,在评论区中刷完这1000条评论后,我们看到的依然是按照评论发布时间由远及近排序的评论
  2. 如果一条评论没有任何点赞,没有任何回复,即热度值为0,则不属于热门评论,故不参与热度排名。如果一个评论区中只有50条热门评论,那么用户打开评论区刷完这50条评论后,展示的是按照评论发布时间排序的评论列表
  3. 在刷完热门评论后,按照评论发布时间排序的评论列表中依然可能会包含热门评论,也就是说,用户会刷到重复的评论。比如,微博的评论列表就会发现,热门评论会重复出现在按照评论发布时间由近及远排序的评论列表中

流程图


4、评论读取流程图


5、架构总览




四、盖楼评论模式

1、数据库递归查询

借助数据库的递归查询能力,直接实现


2、数据库保存完整楼层

单独新增一个build字段,用来保存所有的评论id


3、图数据库

评论间的回复关系本质上就是一个树形结构,所谓盖楼评论无非就是在此树形结构中对某个评论节点进行深度遍历,所以在盖楼模式下非常适合使用图数据库。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于IDEA的快捷键不能使用的原因

有时候IDEA的快捷键用不了,这时应该是快捷键发生冲突了,重新设置一下即可。以批量修改变量名称的shift f6为例(我的这个快捷键用不了): 初始的rename的快捷键为shift f6 这个快捷键是冲突的,所以我们需要…

探索PDF的奥秘:pdfrw库的神奇之旅

文章目录 探索PDF的奥秘:pdfrw库的神奇之旅背景:为何选择pdfrw?pdfrw是什么?如何安装pdfrw?五个简单的库函数使用方法场景应用:pdfrw在实际工作中的应用常见问题与解决方案总结 探索PDF的奥秘:p…

安防监控视频平台LntonAIServer视频智能分析平台新增视频质量诊断功能

随着安防行业的快速发展,视频监控系统已经成为维护公共安全和个人隐私的重要工具。然而,由于各种因素的影响,视频流的质量可能会受到影响,从而导致监控效果不佳。为了解决这一问题,LntonAIServer推出了全新的视频质量诊…

基于.NET6的WPF基础总结(下)

目录 一、集合控件 1. ListBox可选项列表 2. ListView数据列表控件 3. DataGrid数据表格控件 4. ComboBox下拉框控件 5. TabControl 6. TreeView 树形控件 7. Menu菜单 8. ContextMenu上下文菜单 二、图像控件 1. Ellipse 椭圆 2. Line线段 3. Rectangle矩形 4.…

如何打造中小学在线教学平台?Java SpringBoot集成Vue,教育资源管理新篇章

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

基于Transformer架构训练LLM大语言模型:Transformer架构工作原理

视频讲解:Transformer架构的工作原理讲解_哔哩哔哩_bilibili 一 Transformer架构总体架构 1 总体架构图 总体架构说明: 输入层 词嵌入(Word Embeddings): 输入文本中的每个词都被映射到一个高维空间中的向量,这些向…

HTML静态网页成品作业(HTML+CSS)——动漫大耳朵图图网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

智能化的知识管理:大模型在知识图谱构建中的突破性应用

转自:大模型奇点说 知识图谱是一种以图形结构组织数据的知识表示形式,其中,概念、事件、实体等知识单元通过节点呈现,而它们之间的各种关系则通过边来描述。知识图谱的显著特点在于,通过关系的定义,为节点提…

EmguCV学习笔记 VB.Net 9.3 移动检测类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

第十一课,多分支判断

一,多分支结构 某些场景下,判断条件不止一个,可能有多个。 语法格式(下图左): *需要注意:这里仅是以5种选择作为例子, 可以根据自己的需要,在if...else的中间插入任意…

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - Tiling实现

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - Tiling实现 flyfish 前置知识 基于Kernel直调工程的算子开发流程图 其中有一个Tiling实现 什么是Tiling、Tiling实现 计算API,包括标量计算API、向量计算API、矩阵计算API,分别实现调用S…

51单片机-串口通信(电脑向串口助手发送数据不接收)

80C52中的串口通过SCON寄存器配置波特率位可变的,因此,需要通过计算定时器1的参与,在定时器配置过程中选择定时器的相关寄存器TMOD来配置定时器的模式为模式2(8位自动重装定时器,如上图,TL1为计数器&#x…

SpringBoot动态配置Nacos

重要知识点 Nacos属性的简单使用 将SpringBoot中的所有配置全部放入到Nacos中 开发人创建单独的命名空间,修改互不影响 Nacos经常变动的配置抽离到外部文件中 将项目中的所有配置全部放到到 1. 首先引入包 <!-- nacos 接入--><!-- https://mvnrepository.com/artifact…

网络安全服务基础Windows--第14节-数字签名

散列函数&#xff08;Hash Function&#xff09;&#xff0c;也称为哈希函数&#xff0c;是密码学中⼀个重要的⼯具。它能够将任意⻓度的输⼊数据转换为固定⻓度的输出&#xff08;散列值或哈希值&#xff09;。这种转换过程具有单向性&#xff0c;即很难从输出推断出输⼊&…

uniapp scroll-view滚动页面

页面滚动固定距离&#xff08;scrollTop&#xff09; <template><view><button click"Test">测试</button><scroll-view style"height: 100px;" :scroll-top"scrollTop" scroll-y"true" class"scrol…

大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Cadence Virtuoso添加工艺库、转换工艺库格式

系统环境&#xff1a;Red Hat 操作软件&#xff1a;Virtuoso 工艺库&#xff1a;tsmc18rf 1、准备好工艺库文件&#xff0c;放在任意文件夹内&#xff0c;记住文件路径&#xff1a; 2、打开Virtuoso软件&#xff1a; 在桌面右键打开终端&#xff0c;输入&#xff1a; virtuo…

Web3D 技术发展瓶颈在哪里?

Web3D 技术的发展瓶颈主要集中在以下几个方面&#xff1a; 1、性能和优化&#xff1a;尽管现代浏览器和硬件逐步提高了性能&#xff0c;但高质量的3D渲染仍可能导致性能瓶颈。特别是在移动设备上&#xff0c;图形渲染和计算可能会受到限制。建议合理控制好项目资源量&#xff…

DataGridView用法合集【精品】

1.当前的单元格属性取得、变更 [VB.NET] Console.WriteLine(DataGridView1.CurrentCell.Value) Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex) Console.WriteLine(DataGridView1.CurrentCell.RowIndex) DataGridView1.CurrentCell DataGridView1(0, 0) [C#] Con…

毕业设计选题系统

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《毕业设计选题系统》。 毕业论文选题是大学教学管理中的重要环节&#xff0c;关系到高校的教学质量。传统的手工管理方式工作效率低下、管理繁琐&#xff0c;浪费教师和学生的时间与精力的问题。本系统以提高…