该从哪些方面提升系统的吞吐量?

更多大厂面试内容可见 -> http://11come.cn

该从哪些方面提升系统的吞吐量?

我们平时自己做的项目一般没有用户量,都是练手项目,所以并不会在吞吐量上做出很多的优化,但是这样的话,又会导致项目和其他人相比并没有什么亮点,因此可以借鉴一些高吞吐量的架构设计,来为自己的项目添加一些亮点功能,这里总结一下 B 站千万长连消息系统 如何提升系统吞吐量!

B 站千万长连消息系统原文链接:https://mp.weixin.qq.com/s/Thw_mkb-aUepzcjd9RCDzw

1、负载均衡

负载均衡是比较常用的了,通过负载均衡将请求分发到不同的服务器上处理,分散单个节点上的压力,可以提高系统的扩展性和稳定性。

可以根据实际需求设计负载均衡策略,选择合适的节点进行请求的转发。

负载均衡中比较重要的就是 节点的动态扩缩容 ,也就是可以实现节点实时增加、减少,这样在高峰期可以增加部分节点来抗下更高的吞吐量,低峰期可以减少部分节点,避免资源浪费。

2、消息队列

消息队列也是很常用的一个手段,高并发系统的三把利器:分流、缓存、异步

其中分流指的就是将流量分开,对应负载均衡,异步即对应消息队列

为什么要用消息队列呢?

一方面是进行业务之间的结构,另一方面是为了提升系统的性能,通过消息队列可以提升主干流程的响应速度,将一些比较耗时的操作从主干流程中剥离出去。

这里 B 站在设计上增加了 消息队列和消息分发层 ,如果服务层在执行业务逻辑时,还要去推送大量的消息到各个节点上,比较影响消息的吞吐量,因此通过增加 消息分发层 来推送和维护消息,提高了系统的并发处理能力,避免了因消息推送阻塞而导致的性能问题。

3、消息聚合

消息聚合也是比较常用的一个手段,我看了 B 站分享出来的技术文章,多次提到了消息聚合。

如果不使用消息聚合,就拿弹幕消息来说,如果一个用户发送一条弹幕消息,那么这条消息需要扩散到同时在线的所有用户,假如说有 1kw 人在线,那么发送的消息数量就是 1kw * 1kw,消息量巨大!

因此,可以根据一定的规则进行消息聚合,批量推送,比如说达到一定时间内推送一次,或者消息数量达到多少就进行推送一次,如下图:

根据 B 站统计结果,加入消息聚合后,发送消息的 QPS 下降了 60% 左右,大大减少了发送消息所带来的压力!

4、压缩算法

在消息聚合后,降低了消息的数量,减少了发送次数,但是同时发送消息的体积会增加,影响了写入 IO,因此采用 压缩算法 来对消息进行压缩。

市面上常用的两个压缩算法:zlib 和 brotli。

原文对两个压缩算法进行了比较,发现 brotli 算法比较具有优势,因此选择了该算法。

比较结果如下(来自于原文)

相关推荐
FQNmxDG4S13 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全14 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje14 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv715 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫15 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_4352879215 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本15 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin52112315 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯17 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户606487671889617 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java