高并发系统设计 --基于MySQL构建评论系统

news/2023/5/28 7:10:28

如何用MySQL来实现评论系统

为什么我不用mongodb?

  1. 社区成熟度不如MySQL,redis
  2. 需要学习的东西很多,迁移,扩容,片建,集群
  3. redis > mongodb

架构设计

使用MySQL进行存储的话,就必须要用到Redis来做缓存,后台admin需要接通ES来进行查询,comment-service通过异步来进行写Redis和MySQL评论数据,MySQL和ES通过Canal进行binlog同步。

缓存模式

首先我们需要预读,我们读第一页的时候,也需要把第二页的内容加载出来。读第二页的时候,我们预先读第三页,这样可以避免大量的cache miss。

但是这里有一个致命的问题就是:当缓存抖动的时候,会触发大量的cache rebuild,因为我们使用了预加载,容易造成OOM(内存溢出)。因此我们需要使用消息队列来进行逻辑异步化,对于当前请求,只返回MySQL中的部分数据即可。

写的逻辑

至于写的操作,我们要穿透到存储层,因此最好使用消息队列异步削峰。例如我的评论发布出去了,用户过100ms才看到评论,这是无所谓的。

存储设计

comment_subject表

idint主键
obj_idint对象id
obj_typeint对象类型
member_idint作者id
countint评论总数
root_countint跟评总数
all_countint评论+回复总数
stateint状态 0:正常 1:隐藏
attrsint属性 0:置顶 1:不置顶
create_time+update_timedatatime创建时间,修改时间

obj_id+obj_type把评论系统设计成中台。 一般是指搭建一个灵活快速应对变化的架构,快速实现前端提的需求,避免重复建设,达到提高工作效率目的。

obj_id+obj_type形成了一个业务键,比如微博,发帖,发视频,你可以发视频,你也可以发文章,评论系统设计成中台。

comment_index

idint主键id
obj_idint对象id
obj_typeint对象类型
member_idint发表者id
rootint根评论id,不为0是回复评论
parentint父评论id,为0是root评论
floorint评论楼层
countint评论总数
root_countint根评论总数
likeint点赞数
hateint点踩数
stateint状态,0:正常;1:隐藏
attrsint属性
create_timedatetime创建时间
update_timedatetime修改时间

parent:父评论id,其实就是记录是否是回复评论。

comment_content表:

comment_idint主键
at_member_idsvarchar对象id
ipint对象类型
platformint发表者id
devicevarchar跟评论id,不为0是回复评论
messagevarchar评论内容
metavarchar评论元数据:背景,字体
create_timedatetime创建时间
update_timedatetime修改时间

index是索引表,content是内容表。

数据写入:事务更新comment_subjectcomment_indexcomment_content三张表,其中content是非强制性需要一致性考虑的。因此可以先写入content,之后事务更新其他表。即便content更新成功,后续失败仅仅存在一条ghost数据。

数据读取:基于obj_id + obj_typecomment_index表找到评论列表,where root=0 order by floor。之后根据comment_index的id字段捞出comment_content的评论内容。对于二级的子楼层,where parent/root in(id...)

为什么要把index和content分成两个表

comment_index:评论楼层的索引表,实际并不包含内容。comment_content:评论内容的表,包含评论的具体内容。其中comment_index的id字段和comment_content是1对1的关系,这里面包含了几种设计思想。

  • 表都有主键,comment_content没有id,是为了减少一次二级索引查找,直接基于主键检索,同时comment_id在写入要尽可能的顺序自增。
  • 索引,内容分离,方便mysql_datapage缓存更多的row,如果和content耦合,会导致更大的IO。长远来看content信息可以直接使用KV storage存储。

缓存设计

comment_subject_cache【string】

keystringoid_type
valueintsubject marshal string
expireduration24h

comment_index_cache【sorted set】

keystringcache key:oid_type_sort其中sort为排序方式,0:楼层,1:回复数量
memberintcomment_id:评论id
scoredouble楼层号,回复数量,排序得分
expireduration8h

comment_content_cache

keystringcomment_id
valueintcontent
expireduration24h

comment_subject_cache:对应主题的缓存,value使用protobuf序列化的方式存入,这样调用rpc的时候速度可以更块一点。

comment_index_cache:使用redis sorted set进行索引的缓存,索引即数据的组织顺序,而非数据内容。通过预加载少量数据,通过增量加载的方式逐渐预热填充缓存,而redis sorted set skiplist的实现可以做到O(logN) + O(M)的时间复杂度,效率很高

sorted set是要增量追加的,因此必须判定key存在,才能zadd

comment_content_cache:对应评论内容数据,使用protobuf序列化的方式存入。

增量加载(目标表仅更新源数据表中变化的内容)+lazy加载(延迟加载,种将资源标识为非阻塞(非关键)资源并仅在需要时加载它们的策略)

可用性设计

其实就是各种缓存问题,消息队列消息等问题。

如果这个key是热点的key的话可以使用本地缓存+分布式缓存。

那么如何统计是否是热点呢?

这里,我们就移步到我们的下一篇文章了,谢谢大家。

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

android关闭权限管理,Android6.0权限管理以及使用权限该注意的地方

Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解、控 制 app 涉及到的权限。然而对开发人员来说却是一件比較蛋疼的事情。须要兼容适配,并保证程序功能的正常执行。什么叫执行时权限管理呢?在Andro…

posix API与网络协议栈

posix API与网络协议栈 scoket socket包含两部分:fd、tcb(tcp control block) 其中,fd属于文件系统,可在用户态进行操控;而tcb属于内核协议栈 三次握手 服务端API socekt():创建一个tcb和f…

Java设计模式-观察者模式Observer

介绍 观察者模式是行为设计模式之一。当您对对象的状态感兴趣并希望在任何更改时得到通知时,观察者设计模式非常有用。在观察者模式中,观察另一个对象状态的对象被称为观察者,而被观察的对象则被称为主体。 优点 观察者模式设计后&#xff0…

史上最全金融产品架构分析四:信托公司

1.业务种类 信托业可以经营的业务项目依《信托投资公司管理办法》法可分为如下: (1)受托经营资金信托业务。即委托人将自己合法拥有的资金,委托信托投资公司按照约定的条件和目的,进行管理、运用和处分。 &#xff08…

一切技术创新史都是数据史

文/李根 ligenqbitai.com量子位 出品 | 公众号 QbitAI你可曾想过这样一个问题:如果以技术创新、科技发展而论,我们当前正处在一个怎样的周期?有按照热门技术领域的定义,比如这是一个AI、5G和区块链等交叉交融的时代。也有按照应用…

RPC框架泛调用原理及转转的实践

RPC框架泛化调用功能在网关、接口测试等场景下有着广泛的需求,本文给各位读者介绍一下主流的泛化调用实现方式及原理,比较各种实现方案的优缺点,并分享泛化调用在转转的实践。一方面有助于RPC框架使用方理解泛化调用,更好地使用泛…

读懂消费贷款之中国消费金融发展史

读懂消费贷款之中国消费金融发展史 本期让我们来了解以下中国消费金融的发展史吧~ 中国消费金融发展史大致可以分为四个阶段:萌芽期、试点期、发展期、规范期。 萌芽期(1985-2009) 主要提供服务方为商业银行和汽车金融公司。这个阶段主…

世界是部金融史

世界是部金融史 作者 : 陈雨露、杨栋 出版年: 2011-1页数: 286定价: 39.50元ISBN: 9787200085303历史、政治、经济,三门学科结合在一起讲,还讲的很有意思,一个下午看完,其中几点印象深刻:1. 中国历史中皇帝的集权过程…

VScode快速配置C/C++环境

文章目录我安装时仅参考了这两篇分享1.下载并安装VScode 商店C/C插件2.下载MinGW-W64 x86_64-win32-seh3.配置各种.json5.Hello_world.cpp测试我安装时仅参考了这两篇分享 伸手党进:具体步骤主要是这篇:Hudiscount-Vscode配置C/C环境 MinGW-W64 x86_64-…

与姬十三探讨如何42天搞定2500万美金投资,创业秘密都在这里

PMCAFF(pmcaff.com):最大互联网产品社区,是百度,腾讯,阿里等产品经理的学习交流平台。定期出品深度产品观察,互联产品研究首选。还在遗憾错过分答发布会第一现场?在行分答深度报告读…

渣渣二本的辛酸面试之路~

点击上方“IT平头哥联盟”,选择“置顶或者星标”你的关注意义重大!作者:jsonchao链接:https://juejin.im/post/5caf0f89f265da038145c66e一篇非常接地气的面试心得,作者也通过自己的努力,找到了不错的工作。…

【虹科分享】虹科ATEasy软件,您的测试执行和开发专家!

测试和执行专家 虹科ATEasy是功能测试,自动测试系统,数据采集,过程控制和仪表系统的测试执行和快速应用开发框架。虹科ATEasy提供开发,部署和维护软件组件的所有必要工具,包括仪器驱动程序,测试程序&#x…

8Manage:分散的软件正在扼杀公司的生产力

在企业领域,数字化不仅仅是指工具能力,而是指用户如何很好地应用他们的知识来做决策,培养关系,建立声誉,以及动员同事、团队。几十年来,企业已经部署了生产力、搜索和协作平台,以提高员工和业务…

编码的奥秘:布莱叶盲文与二元编码

转自: 《编码的奥秘》 第三章 摩尔斯不是第一个成功地将书写语言中的字母翻译成可解释代码的人,他也不是第一个因为其编码而受到人们纪念的人,享有这个荣誉的是一个晚摩尔斯 1 8年出生的早慧的法国失明少年。虽然人们对他的生平所知甚少&…

朱邦复

朱邦复 求助编辑百科名片 朱邦复,仓颉输入法的发明人,现任香港上市公司文化传信集团的副主席。湖北省黄冈县人。为中文终端机、仓颉输入法、汉卡的发明人。由于其对中文电脑发展的众多贡献,台湾及香港地区的华人誉其为“中文电脑之父”、“中…

团灭LeetCode跳跃游戏(相关话题:贪心,BFS)

目录 LeetCode55跳跃游戏 LeetCode45. 跳跃游戏 II LeetCode1306. 跳跃游戏 III LeetCode1345. 跳跃游戏 IV LeetCode55跳跃游戏 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否…

程序设计思路:体育竞技实例、 霍兰德人人格分析实例

程序设计思路:体育竞技实例 #MatchAnalysis.pyfrom random import random#介绍比赛规则 def printintro():print("这个程序模拟两个选手A和B的某种竞技比赛")print(程序运行需要A和B的能力值(以0-1间的小数表示))#输入比赛信息 def getinputs():a eval(…

【Paper】VDBR:Vehicle Driving Behavior Recognition Based on MVCNN With Joint Data Augmentation

论文原文:点击此处 论文下载:点击此处 论文年份:2019.5 论文被引:2 ABSTRACT This paper proposes a method for vehicle driving behavior recognition based on a six-axis motion processor. This method uses deep-learning …

Emotional Chatting Machine: Emotional Conversation Generation with Internal and External Memory翻译+笔记

情感化聊天机:结合内外记忆的情感对话生成 摘要 情感的感知和表达是对话系统或会话代理成功的关键因素。然而,到目前为止,这一问题还没有在大规模对话生成中得到研究。本文中,我们提出的情感聊天机(ECM)不仅在内容层面(相关性和…

Python 代码调试二三事

♚作者王维栋,网易游戏运维与基础架构部,产品软件设计师,专注于智能监控、性能优化等领域。本文来自《网易游戏运维平台 (neteasegameops)》微信公众号的投稿,隶属于网易游戏运维与基础架构部,运…