超高并发计数系统的架构设计
Posted 系统架构笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超高并发计数系统的架构设计相关的知识,希望对你有一定的参考价值。
计数系统解决什么业务问题?
微博首页的博文消息主体部分,也有有很多计数,分别是一条博文的:
在业务复杂,计数扩展频繁,数据量大,并发量大的情况下,计数系统的架构需要好的设计
如何最快速的实现业务计数呢?
(1)调用层:处于端上的browser或者APP;
(2)站点层:拼装html或者json返回的web-server层;
(3)服务层:提供RPC调用接口的service层;
(4)数据层:提供固化数据存储的db,以及加速存储的cache;
(1)关注服务:提供关注数据的增删查改RPC接口;
(2)粉丝服务:提供粉丝数据的增删查改RPC接口;
(3)消息服务:提供微博消息数据的增删查改RPC接口,消息业务相对比较复杂,涉及微博消息、转发、评论、点赞等数据的存储;
首页的计数需求应该如何满足呢?
个人中心首页,需要展现博文数量这个计数,web层访问message-service的count接口,这个接口执行:
select count(*) from t_msg where uid = XXX
这个方案叫做“count”计数法,在数据量并发量不大的情况下,最容易想到且最经常使用的就是这种方法。
(3)一次查询一个count,每个计数都是一个count语句;
在需要多处计数的地方,这个方案的弊端是很明显的,
(1)每一个访问,对应一条count的数据库访问(count要了老命了);
其效率之低,资源消耗之大,处理时间之长,可想而知。
通过计数外置法进行优化
计数是一个通用的需求,有没有可能,这个计数的需求实现在一个通用的系统里,而不是由关注服务、粉丝服务、微博服务来分别来提供相应的功能呢?
(1)用户(uid)维度的计数:用户的关注计数,粉丝计数,发布的微博计数;
(2)微博消息(msg_id)维度的计数:消息转发计数,评论计数,点赞计数;
于是可以抽象出两个表,针对这两个维度来进行计数的存储:
t_user_count (uid, gz_count, fs_count, wb_count);
t_msg_count (msg_id, forword_count, comment_count, praise_count);
t_count
(id, type, c1, c2, c3, …)
通过type来判断,id究竟是uid还是msg_id,但并不建议这么做。
存储抽象完,再抽象出一个计数服务对这些数据进行管理,提供友善的RPC接口
这样,在查询一条微博消息的若干个计数的时候,不用进行多次数据库count操作,而会转变为一条数据的多个属性的查询.
甚至,可以将微博首页所有消息的计数,转变为一条IN语句(不用多次查询了)的批量查询:
select * from t_msg_count
where msg_id IN
($msg_id1, $msg_id2, $msg_id3, …);
IN查询可以命中msg_id聚集索引,效率很高。
那么,当有微博被转发、评论、点赞的时候,计数服务如何同步的进行计数的变更呢?
如果让业务服务来调用计数服务,势必会导致业务系统与计数系统耦合。可以通过MQ来解耦,在业务发生变化的时候,向MQ发送一条异步消息,通知计数系统计数发生了变化即可:
(3)counting-service从MQ接收消息;
(4)counting-service变更这个uid发布微博消息计数;
(1)通过counting-service单独保存计数;
以上是关于超高并发计数系统的架构设计的主要内容,如果未能解决你的问题,请参考以下文章
成为架构师课程系列怎样进行高性能高可用的高并发系统的设计?
字节二面:10Wqps超高流量系统,如何设计?
架构高可用高并发系统的设计原则
10Wqps 超高并发 API网关 架构演进之路
基于Go语言实现高并发推荐系统架构设计
3 02 | 高并发架构设计方法:面对高并发,怎么对症下药?