? 每秒30W次的点赞业务,怎么优化?_CQITer_重庆IT人之家 yabo10.com亚博体育,亚博娱乐在线网站,亚博国际娱乐7171 ?

每秒30W次的点赞业务,怎么优化?

每秒30W次的点赞业务,怎么优化?

继续答星球水友提问,30WQPS的点赞计数业务,如何设计?

可以看到,这个业务的特点是:

吞吐量超高;

能够接受一定数据不一致;

画外音:计数有微小不准确,不是大问题。

先用最朴素的思想,只考虑点赞计数,可以怎么做?有几点是最容易想到的:

肯定不能用数据库抗实时读写流量;

redis天然支持固化,可以用高可用redis集群来做固化存储;

也可以用MySQL来做固化存储,redis做缓存,读写操作都落缓存,异步线程定期刷DB;

架一层计数服务,将计数与业务逻辑解耦;

此时MySQL核心数据结构是:

t_count(msg_id,?praise_count)?

此时redis的KV设计也不难:

key:msg_id

value:praise_count

每秒30W次的点赞业务,怎么优化?

似乎很容易就搞定了:

服务可以水平扩展;

数据量增加时,数据库可以水平扩展;

读写量增加时,缓存也可以水平扩展;

计数系统的难点,还在于业务扩展性问题,以及效率问题。

以微博为例:

每秒30W次的点赞业务,怎么优化?

用户微博首页,有多条消息list,这是一种扩展;

同一条消息msg_id,不止有点赞计数,还有阅读计数,转发计数,评论计数,这也是一种扩展;

假如用最朴素的方式实现,多条消息多个计数的获取伪代码如下:

//?(1)获取首页所有消息msg_id?

list<msg_id>?=?getHomePageMsg(uid);?

//?(2)对于首页的所有消息要拉取多个计数?

for(?msg_id?in?list<msg_id>){?

?????????//(3.1)获取阅读计数?

?????????getReadCount(msg_id);??

?????????//(3.2)获取转发计数?

?????????getForwordCount(msg_id);?

?????????//(3.3)获取评论计数?

?????????getCommentCount(msg_id);?

?????????//(3.4)获取赞计数?

?????????getPraiseCount(msg_id);?

}?

由于同一个msg_id多了几种业务计数,redis的key需要带上业务flag,升级为:

msg_id:read?

msg_id:forword?

msg_id:comment?

msg_id:praise?

用来区分共一个msg_id的四种不同业务计数,redis不能支持key的模糊操作,必须访问四次reids。

假设首页有100条消息,这个方案总结为:

for循环每一条消息,100条消息100次;

每条消息4次RPC获取计数接口调用;

每次调用服务要访问reids,拼装key获取count;

画外音:这种方案的扩展性和效率是非常低的。

那如何进行优化呢?

首先看下数据库层面元数据扩展,常见的扩展方式是,增加列,记录更多的业务计数。

每秒30W次的点赞业务,怎么优化?

如上图所示,由一列点赞计数,扩充为四列阅读、转发、评论、点赞计数。

增加列这种业务计数扩展方式的缺点是:每次要扩充业务计数时,总是需要修改表结构,增加列,很烦。

有没有不需要变更表结构的扩展方式呢?

行扩展是一种扩展性更好的方式。

每秒30W次的点赞业务,怎么优化?

表结构固化为:

t_count(msg_id,?count_key,?count_value)?

当要扩充业务计数时,增加一行就行,不需要修改表结构。

画外音:很多配置业务,会使用这种方案,方便增加配置。

增加行这种业务计数扩展方式的缺点是:表数据行数会增加,但这不是主要矛盾,数据库水平扩展能很轻松解决数据量大的问题。

接下来看下redis批量获取计数的优化方案。

每秒30W次的点赞业务,怎么优化?

原始方案,通过拼装key来区分同一个msg_id的不同业务计数。

可以升级为,同一个value来存储多个计数。

每秒30W次的点赞业务,怎么优化?

如上图所示,同一个msg_id的四个计数,存储在一个value里,从而避免多次redis访问。

画外音:通过value来扩展,是不是很巧妙?

总结

计数业务,在数据量大,并发量大的时候,要考虑的一些技术点:

用缓存抗读写;

服务化,计数系统与业务系统解耦;

水平切分扩展吞吐量、数据量、读写量;

要考虑扩展性,数据库层面常见的优化有:列扩展,行扩展两种方式;

要考虑批量操作,缓存层面常见的优化有:一个value存储多个业务计数;

计数系统优化先聊到这里,希望大家有收获。

相关推荐
新闻聚焦
猜你喜欢
热门推荐
  • 微软AI面试题有多难?这里有一份样卷

      究竟什么样的AI人才能被微软这样的巨头聘用呢?今天,文摘君就淘来了几道微软AI 面试题,同时给出了最基本的解答......

    06-25????来源:澎湃新闻网

    分享
  • 全球最聪明的大脑怎么看AI?他们预测了

      2017年AI领域取得了诸多成果。2018年AI又将何去何从?以下是来自世界顶级研究人员和行业领军人物对2018年AI领域发展作......

    02-20????来源:虎嗅网

    分享
  • 2017JavaScript框架战报 - React分战场

      我们来看看与React有关的软件包的生态系统。当Facebook构建React时,就有许多来自开源社区的第三方软件包。为提供完......

    02-27????来源:湖北新闻网

    分享
  • 小白学数据:教你用Python实现简单监督学

      监督学习作为运用最广泛的机器学习方法,一直以来都是从数据挖掘信息的重要手段。即便是在无监督学习兴起的近......

    03-05????来源:今日头条

    分享
  • 现代编程语言Swift、Kotlin等十大有趣功能

      最近学习了一些现代编程语言,比如Reason,Swift,Kotlin和Dart。这些编程语言提供了许多新功能,本文主要分享了我认......

    04-29????来源:祁东新闻网

    分享
  • 领域场景分析的6W模型

      组成场景的要素常常被称之为6W模型,即描写场景的过程必须包含Who,What,Why,Where,When与hoW这六个要素。......

    04-30????来源:砍柴网

    分享
  • 开源应用服务器WildFly 12发新季度交付模式

      WildFly 12 Final版本现在已经可以下载了,WildFly是一款灵活的开源应用服务器,支持开发人员构建轻量级应用程序。支持......

    05-10????来源:青岛新闻网

    分享
  • 基于Spring Cloud的微服务落地

      微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务。但如果要将微服务架构运用到生产项目上,......

    06-04????来源:广西新闻网

    分享
  • 为什么阿里工程师纷纷在内网晒代码?

      前阵子,在阿里一个小黑屋里,5名对代码有着极致追求的工程师参与阿里代码领域最高荣誉“多隆奖”的最终角逐。......

    06-08????来源:四川新闻网

    分享
  • 超级大汇总!200多个最好的机器学习、

      我把这篇文章分为了四个部分:机器学习,自然语言处理,python和数学。在每个部分中我都列举了一些主题,但是因......

    09-25????来源:洛阳新闻网

    分享
返回列表
Ctrl+D?将本页面保存为书签,全面了解最新资讯,方便快捷。