前几天的上线功能bug,由于评论数量过多,未异步加载,导致数据丢失,原因是新老功能迁移时未做异步加载,就此功能找一下微博类评论等功能的架构设计思考,还有其他产品,社区,论坛,博客等。

微博曾流传可支撑8位明星同时出轨,但大事件屡屡挂掉,周杰伦出新歌,充值点播渠道挂掉,2019年财报微博日平均活跃用户2.16亿,面对亿级平台该如何设计架构?

难点一:大V发布微博,大事件下同时可达百万,千万用户接受到订阅消息,微博需要对此条信息进行计数,评论,点赞进行过滤,转到用户的各个平台。

难点二:数万用户同时访问,系统单点故障导致的雪崩问题,访问速度变慢,甚至单节点挂掉,导致惊群效应。

难点三:评论的套娃现象,以及实时回复展示问题,一条热评下会有数量回复,以及层级下的回复,且能实时回复并展示。

以上是个人觉得难点所在,平时的业务也可能出现类似现象,但用户量是个问题,达不到峰值访问,就测不出很多隐藏问题。

没有实战经验的高并发都是纸上谈兵!

当看过新浪架构师开发者大会实记后会有所感悟,文章就不大篇幅复制了,贴下链接。

https://blog.csdn.net/guodongbuding0423/article/details/83765669?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

第一:数据拆分,异步推送

第二:静态内容CDN加速,允许单点失败,服务分解

第三:安全监控,Master/Slave

1、读扩散还是写扩散?

inbox: 收件箱,你收到的消息,即你所关注的人发布的消息。outbox: 发件箱,你发布的消息。

写扩散(Push)

该方式为每个用户维护一个订阅列表,记录该用户订阅的消息索引(一般为消息ID、类型、发表时间等一些元数据)。每当用户发布消息时,都会去更新其follower的订阅列表。优点:读很轻。初始化时仅需要读取自己的inbox即可。缺点:写很重。每发布一个消息,会导致大量的写操作。注:一般来说,用户发布消息,并不会更新所有followers的订阅列表,仅更新在线followers即可。

读扩散(Pull)

该方式为每个用户维护一个发送列表,记录该用户所有发表过的消息索引。优点:写很轻,节省空间。用户每发布一条消息,仅需更新自己的outbox。缺点:读操作很重,计算量大。假设你收听了1k用户,则初始化时,需要从1k个用户的outbox拉取消息,然后计算获得最新的n条消息。

混合模式(Push+Pull)

该方式既为读写扩散的结合,根据用户followers的数量来决定是读扩散还是写扩散。例如followers大于1k的,则使用读扩散,否则使用写扩散。

从目前现在网上的一些资料来看,Twitter是写扩散,腾讯微薄是读扩散,新浪微薄则是二者结合。

2、关于Cache

对于一个千万级甚至亿级用户的大型网站来说,合理使用Cache至关重要。

一个用户的核心数据由如下几个部分组成:inbox,outbox,关系链,消息内容。

inbox:主要缓存消息索引,仅为在线用户缓存,从Timyang的PPT来看,新浪微博估计是使用redis的list或set实现。

outbox:缓存一定数量(例如200)条最近发表的消息。

关系链:following相对于followers来说,缓存容易些,follower加载开销比较大,例如刘翔在腾讯微博的听众超过1600万。

消息内容:按内容年龄缓存;一般需要多份支持容灾;需要缓存xml,json,rss,atom等多种格式的缓存以供API使用。

以Twitter为例,其将Cache分为四类:Vector Cache,Row Cache,Page Cache,Fragment Cache,均使用memcached实现。其中:

Vector Cache主要缓存用户的inbox以及outbox索引,其命中率高达99%;

Row Cache主要缓存用户关系链数据,以及Tweets内容,命中率为95%;

Fragment Cache缓存Tweet的xml,json,rss,atom四种格式数据,以供API使用,命中率为95%;

Page Cache主要原来缓存那些高人气用户的个人主页,命中率仅为40%。

下图为TwitterCache架构图:

Twitter为啥要为API通道设置Fragment Cache和Page Cahce呢?其原因是Twitter的80%流量来自API。

下面以新浪微博介绍一下Cache流程:

消息发布流程:

更新自己的outbox

加载followers列表

更新followers inbox

获取首页流程:

检查inbox cache是否可用

获取关注列表

聚合内容,获得消息索引

根据索引,返回最终聚合的消息内容

3、关于存储

目前Twitter和新浪的落地存储,都是使用MySQL。而腾讯微博则使用采用SSD+大文件存储(每次写操作都是append操作,写操作可以先用内存缓存,达到适当大小合并,尽量减少随机写)。其他细节因不清楚或不方便透露,不做细述。

4、关于洪峰处理。

一般用异步队列处理方式。消息队列产品有:Kestrel(twitter使用Scala实现),RabbitMQ(使用Erlang实现),MemcacheQ。

Twitter 09年时,用户的平均followers数量为126个。按照每秒400消息发布数算,那每秒就需要推送126*400=50400条消息出去。为了削峰,Twitter自己用Scala实现了一个分布式消息队列Kestrel,其代码仅为1200行,运行在3台机器上,其使用memcached协议,其Server之间无共享状态,且全内存。新浪使用的是MemcacheQ

转自:http://pananq.com/index.php/2011/05/21/%E5%BE%AE%E8%96%84%E5%90%8E%E5%8F%B0%E6%9E%B6%E6%9E%84%E6%B5%85%E6%9E%90/

目前只能搜索与个平台发布会以及内容分析,暂时未找到先关技术贴,通过架构分析了解下解决方案。

java怎么实现微博评论_关于微博评论功能的设计与思考相关推荐

  1. iOS 新浪微博-5.2 首页微博列表_转发微博/工具栏

    继续于上一篇,还是做首页的功能,这一篇把剩下的首页继续完善. 看看上面的图片,分析: 1.转发微博里面的内容,和原创微博是一样的,由文字+配图组成.这应该放在一个UIView里处理. 2.工具栏也当成 ...

  2. php实现和MySQL实现评论_仿网易评论盖楼PHP+Mysql实现

    这篇文章主要介绍了关于仿网易评论盖楼PHP+Mysql实现,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 大家可能都看过网易评论的那种盖楼式的引用,这边文章就用php和mysql来实现 ...

  3. 微博评论点赞mysql设计_关于微博评论功能的设计与思考

    前几天的上线功能bug,由于评论数量过多,未异步加载,导致数据丢失,原因是新老功能迁移时未做异步加载,就此功能找一下微博类评论等功能的架构设计思考,还有其他产品,社区,论坛,博客等. 微博曾流传可支撑 ...

  4. android仿微博头像_仿微博点击头像加载动画

    预览图 原理 整个效果分成两部分.一部分为弧度动画,一部分为点点动画 弧度动画就是画弧线,动画改变弧度就可以了 点点动画比较复杂.总共分为两步,1.计算非弧线的地方可以容纳的点点个数,然后画出来:2. ...

  5. java实现踢下线用户_浅谈踢人下线的设计思路!(附代码实现方案)

    前言 前两天写了一篇文章,主要讲了下java中如何实现踢人下线,原文连接:java中如何踢人下线?封禁某个帐号后使其会话当即掉线!前端 原本只是简单阐述一下踢人下线的业务场景和实现方案,没想到引出那么 ...

  6. java招投标管理系统的区别_建设项目招投标信息管理系统的设计与开发

    (页数:10字数:5716)摘 要:文章介绍了基于MVC2建设项目招投标信息管理系统的设计与开发,该系统的目的是为了通过信息化技术实现保证招投标工作的公开.公平.公正,为招标人.投标人.监管部门提供有 ...

  7. java阿基米德螺线_阿基米德螺线图形设计_java基础实验报告.doc

    阿基米德螺线图形设计_java基础实验报告.doc 南京工程学院实验报告课程名称JAVA基础实验项目名称图形用户界面设计实验题目阿基米德螺线图形设计实验学生班级网络132实验学生姓名薛康威学号2021 ...

  8. java构建内存池队列_内存池完整实现代码及一些思考

    为了提高效率和有效的监控内存的实时状态,我们采取了内存池的思想来解决效率与对内存实现监控的问题. 网上查找到了一些方案,根据自己的理解实现了应用. 我们什么时候要调用到内存池, 1,当我们频繁的申请释 ...

  9. Java充电宝模型设计_继续探讨点赞功能模块设计

    继续探讨点赞功能模块设计 前几天我们设计了点赞模块的模块,大致思路就是: 用户点赞,首先缓存到redis中进行保存,redis中既要保存点赞总数,还要保存点赞记录.然后定时执行redis数据到数据库中 ...

  10. java签到断签重置_签到打卡功能,7天一个周期,中间断签重新开始

    表 用户签到表 CREATE TABLE `t_user_sign` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `count` int(11) DEFAUL ...

最新文章

  1. PHP全栈学习笔记20
  2. [SDOI2017]硬币游戏
  3. 点击页面空白处就关闭某个层是怎么做到的
  4. 自定义YUM软件仓库----FTP网络YUM源-----网络YUM源的配置
  5. 计算机专业技术人员工作总结,计算机教师专业技术年终工作总结及计划范文模板.docx...
  6. 【小白学习C++ 教程】二十一、C++ 中的STL容器Arrays和vector
  7. AUTOSAR从入门到精通100讲(九)-汽车Tbox
  8. layui 如何清空form表单
  9. ToolTip特效 JavaScript 盗取厦门人才网的特效
  10. paip.提升用户体验---网站导航栏的设计
  11. ls命令显示颜色含义详解
  12. DAHnbsp;CEO:华尔街金融公司比区…
  13. 西北工业大学明德学院计算机老师,师资队伍结构
  14. jbpm创建流程图_jbpm - 工作流的基本操作
  15. cat3速度 rj45_常用RJ45网线的规格及型号总结
  16. PPT修改幻灯片大小
  17. 生信常用分析图形绘制03 -- 富集分析圈图
  18. 天翼云赋能智慧农业 新农人迎来好收成
  19. 微信小程序云开发使用创建
  20. 代码随想录训练营day35

热门文章

  1. css设置字母数字字体库信息
  2. efs+pro+for+三星android设备,【极光ROM】-【三星S8/S8+ G9550/G9500】-【V30.0 Android-PIE-TL2】...
  3. VOC2007-2012数据集
  4. vnc全屏界面怎么设置小_如何设置 才能 修改 vnc 有效窗口大小
  5. 通信原理学习笔记5-1:数字调制——脉冲成形滤波器选择(码间串扰、Nyquist准则、升余弦滚降滤波器、眼图)
  6. 无码间串扰的基带传输特性
  7. matlab二次求导函数,原来可以这样求导函数,再复杂的函数求导不再话下!
  8. android网上书城管理源代码,网上书店管理系统(附程序源代码).doc
  9. 欧派caxa设计软件_欧派与数码大方携手,CAXA智能家居设计软件引领家居变革
  10. win10安装Mujoco150和mujoco-py 1.50.1.0