如何设计一个70W在线人数的弹幕系统文章分析
一:故事背景
今天学习了一篇非常有用的文章,对此文章进行了分析,将分析结果写成博客分享给大家。
原文地址:
如何设计一个70W在线人数的弹幕系统
二:问题分析
2.1 带宽压力
假如说每3秒促达用户一次,那么每次内容至少需要有15条才能做到视觉无卡顿。15条弹幕+http包头的大小将超过3k,那么每秒的数据大小约为8Gbps,而运维同学通知我们所有服务的可用带宽仅为10Gbps。
2.2 弱网导致的弹幕卡顿、丢失
该问题已在线上环境
2.3 性能与可靠性
百万用户同时在线,按照上文的推算,具体QPS将超过30w QPS。如何保证在双十一等重要活动中不出问题,至关重要。性能也是另外一个需要着重考虑的点
二:涉及知识
2.1 http包头
一个http数据包请求由4个部分组成:请求行、请求头标、空行、请求数据。
请求行分为了三个部分。请求方法,请求url与http版本。
请求头行,由关键字值对组成,使用:分隔
空行
请求数据,请求正文中可以包含客户提交的查询字符串信息。
2.2 QPS
qps即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
QPS=并发量/平均响应时间。
并发量=QPS*平均响应时间。
2.3 http压缩
HTTP压缩是指在Web服务器和浏览器间传输压缩文本内容的方法。HTTP压缩通常采用gzip压缩算法压缩HTML、JavaScript、CSS等文件。
通过http压缩的方式,降低网络传输的数据量,从而提高客服端的访问速度。这种方法会提高服务器cpu的负荷。因为服务器在接收到客户端的http请求后需要检查浏览器是否支持http压缩,如果支持的话,根据配置压缩相应网页文件。
2.4 gzip压缩
gzip用于unix系统的文件压缩,我们在linux系统中经常用到的.gz文件,就是gzip格式的。http协议上的gzip编码可以用来改进web应用程序的性能。当客户端访问目标服务器中的网站时,服务器将网页内容压缩后传输到来访的浏览器中显示。对于纯文本内容可以压缩到原大小的40%。以此来提高访问速度。
2.5 Long Polling via AJAX
客户端向服务器发送Ajax请求,服务器接到请求后保持住连接,直到有新消息才返回响应信息,客户端处理完响应信息后再向服务器发送新的请求。这样做的好处是可以省去很多无用的请求。但是需要服务端保持大量的连接。
2.6 WebSockets通信
WebSocket。服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
2.7 TCP长连接与短连接
短连接环境下,数据交互完毕后,主动释放连接。
长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
在上文中,由于东南亚的弱网环境,tcp长连接也会因为网络问题断开,所以无论是Long Polling via AJAX还是WebSockets通信都不符合我们的业务需要。
四:解决方案
4.1:服务拆分
上文所给出的案例中,弹幕业务。发送弹幕与查询弹幕完全不在同一个量级,通过将业务进行拆分,将发送弹幕逻辑与查询弹幕逻辑拆分。可以让两个服务不互相影响,保证服务的可用性。
4.2:引入本地缓存
引入本地缓存的好处是,用户不必等待数据返回,而是读取内存中缓存的数据,大幅度降低调用时延。
4.3 带宽优化
4.3.1 启用Http压缩
通过查阅资料,http gzip压缩比率可以达到40%以上(gzip比deflate要高出4%~5%)。
4.3.2 Response结构简化4.3.3 内容排列顺序优化
根据gzip的压缩的压缩原理可以知道,重复度越高,压缩比越高,因此可以将字符串和数字内容放在一起摆放
4.3.4 频率控制
带宽控制:通过添加请求间隔参数(下次请求时间),保证客户端的请求频率服务端可控。以应对突发的流量增长问题,提供有损的服务。
稀疏控制:在弹幕稀疏和空洞的时间段,通过控制下次请求时间,避免客户端的无效请求。
五:总结&提升
这篇博客讨论了设计一个70万在线人数的弹幕系统所面临的问题,并提出了相应的解决方案。主要问题包括带宽压力、弱网导致的弹幕卡顿和丢失、性能与可靠性等。为了解决这些问题,博客提出了以下解决方案:
1.服务拆分:将发送弹幕和查询弹幕的业务逻辑拆分为独立的服务,以确保服务的可用性和高效性。
2.引入本地缓存:通过引入本地缓存,减少数据返回时延,提高读取速度,降低用户等待时间。
3.带宽优化:采用HTTP压缩和优化响应结构、内容排列顺序等方式,减少数据传输量,提升带宽利用效率。
4.频率控制:通过添加请求间隔参数和控制请求频率,以应对突发流量和稀疏时间段的请求问题。
博客中还提及了相关的知识点,如HTTP包头、QPS、HTTP压缩、gzip压缩、Long Polling via AJAX、WebSockets通信、TCP长连接与短连接等。
通过这些解决方案和知识点的应用,可以提高弹幕系统的性能、可靠性和用户体验,应对大量在线用户和网络环境的挑战。