如何设计高并发场景下的实时排行榜系统

核心思路:异步解耦+内存加速+增量推送

一、系统需求与核心目标

1. 核心需求

近似实时统计:数据满足最终一致性,无需强一致性

Top N查询:前端需快速获取前N名(如Top 100)

通用性设计:支持多业务类型(点赞/积分/评论等)

高并发支持:应对流量高峰和用户量增长

2. 非功能性要求

低延迟查询:减少数据库计算压力

幂等性保障:避免重复操作导致数据错误

可扩展性:支持动态扩容和任务隔离

二、数据库表设计

1. 历史记录表(操作流水)

字段设计

rank_type:排行榜类型(如点赞/评论/积分)

object_id:实体ID(用户/文章/游戏角色等)

count:操作数值(支持正负值)

create_time:操作时间

功能:记录原始操作流水,用于数据溯源和批量处理

2. 结果表(排行榜快照)

字段设计

object_id:实体ID

rank_type:排行榜类型

total_count:累计分数(如总点赞数)

create_time:更新时间

索引优化(rank_type, total_count)组合索引提升排序效率

三、架构演进与优化策略

1. 初期方案(同步调用)

流程:业务系统直接同步调用排行榜服务写入DB

问题

• 强耦合导致接口延迟高

• 数据库读写压力大,无法应对高并发

2. 引入消息队列(解耦与削峰)

技术选型:RocketMQ/Kafka

优化点

• 业务系统异步发送MQ消息,降低耦合

• 批量消费消息减少DB IO次数

• 按rank_type分区保证顺序性

幂等处理:通过唯一键(如object_id+create_time)避免重复消费

3. 引入Redis(实时排序加速)

技术选型:Sorted Set(ZSET)

实现方式

• Key结构:rank:{rank_type}(如rank:comments

• 操作命令:ZINCRBY更新分数,ZREVRANGE查询Top N

优势

• 内存排序实现毫秒级响应

• 支持动态分数更新

风险控制

• 避免大Key问题(分片或定期清理过期数据)

四、高可用与扩展性设计

1. 消费任务隔离

动态配置:按rank_type分配独立Topic和消费者组

物理隔离:不同业务类型独立部署消费任务

2. 高可用方案

HA机制:通过ZooKeeper/etcd实现消费任务主备切换

进度同步:记录消费位移(Offset),故障恢复后接续消费

五、实时推送优化

1. WebSocket集成

实时推送:服务端主动推送排行榜变化至客户端

推送触发条件:仅当Top N名次变化时触发

2. 变化检测策略

方案一:计算Top N数据的MD5摘要,对比变化后推送

方案二:逐条对比前N名数据,仅推送变化部分

增量推送:仅发送发生名次变动的实体(如最后一名替换)

六、性能优化补充

1. 数据存储优化

冷热分离:历史数据归档,仅保留活跃周期数据(如最近7天)

读写分离:主库处理写操作,从库分担读压力

2. Redis扩展方案

分片存储:按rank_type哈希分片,分散大Key压力

过期策略:为临时榜单设置TTL自动清理

七、关键注意事项

  1. 幂等性贯穿全流程:MQ消费、DB写入、Redis更新均需幂等设计
  2. 监控与告警: • 监控MQ堆积、Redis内存使用、DB慢查询 • 设置阈值触发扩容或降级
  3. 动态配置能力:支持运行时调整排行榜周期、Top N数量等参数
全部评论
用treemap+map可以实现java的zset,而且没有大key风险
2 回复 分享
发布于 04-07 01:33 上海
mark
点赞 回复 分享
发布于 05-02 16:33 上海
这是gpt生成的吗,我感觉有点过于复杂了
点赞 回复 分享
发布于 04-23 18:30 上海
mark
点赞 回复 分享
发布于 04-06 13:53 浙江

相关推荐

04-18 13:48
已编辑
大连理工大学 算法工程师
uc标题党哈…暑期终于从鹅厂开始,鹅厂结束。直到现在想起仍觉得梦幻,睡不着,写下此文。牛客上大多uu都是开发,我见到的算法岗很少,所以也许我的经历能有一些不一样的色彩吧。也看过很多很多的uu暂时身陷泥淖,发的文章感人深切。我坚信人生总有逆风翻盘之时,一定要坚持,才能让成功有机会眷顾。楼主bg双中下九,一直并不以学历为优势或背书,因为无论在哪个平台,大家都会更关注比自己更强的那些人。硕士期间一些努力加一些运气,收获了一篇论文,当时就决定尝试一下算法。于是开始猛猛的巩固自己的基础知识,让自己的理论层面更有竞争力。这个过程说难也难,说简单也简单,至少楼主自己认为难度是比不上很多uu花大量的时间背八股的。也因此,楼主其实每次在完全看不懂很多uu的面经时会产生很高的敬意,楼主觉得开发的准备工作以及横向竞争真的压力太大了。跑题了……总之匆匆准备好之后,楼主开始在三月初投递简历。楼主的研究方向是智能体强化学习,简而言之就是研究AI在游戏博弈中的智能行为的。结果打开各企业的校招网站,直接蒙圈了。岗位真的太少了,仔细一想后端开发每个公司都要,但是算法只有大厂才会有,还必须找对口的,很多时候容错直接降低了。在没有机器人厂开实习的情况下,楼主发现只有鹅厂,猪厂以及小破站能有对应的岗位。于是投了不到十份简历就等着了。即使是只有十份简历,也只有两个是完全对口的,其他的都是通用算法岗,楼主本身也不太想去。一是担心学不到东西,二是担心自己没有产出。结果第一次面就面最想去的鹅厂,紧张到爆炸了,很多东西都支支吾吾的,手撕大脑也是一片空白,好在是最后想出来了。面完之后缓了一小时才恢复。后来面试越来越多,就不再那么紧张了。也遇到过好的面试官,和一些我不太满意的面试官。一直只想着鹅厂猪厂,还是容错太低了,如果挂了真的不知道自己该何去何从了。尤其是三月底再看,我投递的岗位已经全被撤下,心里更是一阵悸怕,万一当时准备的再晚一些就真的找不到实习了。中间鹅厂又卡了很久的录用评估,期间还拒绝了字节的邀请,也是内容太不对口了。这段时间就一直在想如果这两家大厂不要楼主怎么办,找不到任何对口的方向,开发又不懂,好像真的没办法了。后来很快的把心态调整好了,自己选择的路,跪着也要走完。面试也越来越自信,最终拿下了鹅厂的offer。仔细回首,侥幸没有挂过一场面试,倒是自己主动把另外两个大厂终止了,也算是一帆风顺吧。不过楼主无意凡尔赛,只是觉得这种小众方向岗位太少,容错太低,要么鸡犬升天,要么万劫不复。好就好在竞争也少些吧,只能说每条路都各有难处,谈不上谁比谁简单。这个形势下,谁又不是自身难保。未来的路还得自己走,努力才是唯一的答案。#牛客AI配图神器#  #腾讯求职进展汇总#  #牛客创作赏金赛#  #还记得你第一次面试吗?#
点赞 评论 收藏
分享
评论
7
63
分享

创作者周榜

更多
牛客网
牛客企业服务