当前位置: 首页 > news >正文

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

评论服务

    • 一、概述
    • 二、单级评论模式
      • 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、图数据库

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SqlServer: 安装或升级到SqlServer2022
  • 反序列化漏洞(一)
  • 【架构-28】轮询,最小连接、随机等负载均衡算法
  • 角谷猜想——考拉兹猜想
  • springblade-JWT认证缺陷漏洞CVE-2021-44910
  • IDEA取消自动选择光标所在行
  • 【unity知识】OnAnimatorMove+root motion,Root Motion+Blend Tree,解决Animator动画和位移不同步问题
  • jupyter 安装新内核后报找不到已安装的包
  • Java | Leetcode Java题解之第392题判断子序列
  • 【Python123题库】#通讯录(文件读取) #利用数据文件统计成绩
  • 《深度学习》OpenCV轮廓检测 轮廓近似、模板匹配 解析及实现
  • STM32常用C语言知识总结
  • ubuntu搜狗输入法取消切换繁体
  • HTTPS 协议“加密和解密”详细介绍
  • 论文精读:Dirac半金属反常能斯特效应设计
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • css属性的继承、初识值、计算值、当前值、应用值
  • export和import的用法总结
  • httpie使用详解
  • Linux中的硬链接与软链接
  • magento 货币换算
  • rc-form之最单纯情况
  • 回顾2016
  • 如何合理的规划jvm性能调优
  • 如何胜任知名企业的商业数据分析师?
  • 入门级的git使用指北
  • 通过git安装npm私有模块
  • 线上 python http server profile 实践
  • ​Redis 实现计数器和限速器的
  • ## 1.3.Git命令
  • #if等命令的学习
  • #Linux(make工具和makefile文件以及makefile语法)
  • #微信小程序:微信小程序常见的配置传值
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (1)SpringCloud 整合Python
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (7)STL算法之交换赋值
  • (done) 两个矩阵 “相似” 是什么意思?
  • (k8s中)docker netty OOM问题记录
  • (zt)最盛行的警世狂言(爆笑)
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十一)c52学习之旅-动态数码管
  • (五)IO流之ByteArrayInput/OutputStream
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Sql Server 保留几位小数的两种做法
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]