抖音是一款风靡全球的短视频应用,抖音以其简洁、直观和趣味性的特点,吸引了数亿用户的关注。然而,抖音并非一夜之间崛起,它经历了多年的发展历程,从最初的短视频平台,到现在的社交媒体巨头,技术上面的不断地创新和突破,成为了当今世界上最受欢迎的应用之一。
抖音的日活用户从最初的200w已经到了惊人的日活8个亿,如此高的日活下。其无时无刻都在经历着极其强大的压力,那么抖音是如何进行系统设计的呢?下面我们来进行详细的探究。
抖音的后端架构涉及到大量的服务器和服务,用于处理用户上传的视频、评论、点赞、关注等功能。为了开发和应对快速开发迭代的需求,因此抖音的架构是使用微服务架构的。
为了应对大量需求,使用大量技术,下面我们一一介绍:
消息队列:消息队列可以允许服务异步地发送和接收消息,而不需要直接依赖对方的可用性和状态。消息队列通过将消息存储在队列中,并确保消息在合适的时间被传递给接收者,来实现解耦和异步通信。因为使用消息队列进行通信之后,服务之间彼此不再关联,各个微服务主要专注于自己的业务就可以了,实现了解耦合。并且如果业务发生了通信,恰巧有事没有接收,那么可以将信息存储到消息队列,这样就实现了异步通信。
抖音内部使用的消息队列主要是RabbitMQ用在秒杀,抢购当中,自研的BMQ和Kafka用在日常使用当中,并且趋势是BMQ逐渐代替Kafka的过程当中。
负载均衡:在抖音的架构中,负载均衡起到了平衡服务器负载、提高系统性能和可靠性的重要作用。通过将请求合理地分发到不同的服务器,负载均衡能够避免某些服务器过载而导致性能下降,同时也有助于实现横向扩展和高可用性。
实际上负载均衡有多种算法可以选择,这里我们简单介绍一些常见的负载均衡算法:
- 随机(Random): 这是一种简单的算法,随机选择一个服务器来处理请求。在抖音中,随机算法可以用于均匀地分发请求,从而避免某个服务器被过多请求拥挤。
- 轮询(Round Robin): 这是一种简单且公平的算法,每个请求按顺序发送到不同的服务器。
- 最小连接数(Least Connections): 这个算法将请求发送到当前连接数最少的服务器。实际生产过程中,服务器可能因为资源限制或其他因素而无法承载过多的连接,这时可以使用最小连接数算法将请求分发到负载较轻的服务器上。
- 最少响应时间(Least Response Time): 这个算法选择响应时间最短的服务器来处理请求。服务器可能因为性能更高而能够更快地响应请求,使用最少响应时间算法可以确保请求被分发到性能更好的服务器上。
在日常实际生成过程中,肯定需要根据场景不同设计适合自己场景的一些负载均衡算法。
RPC:RPC作为微服务之间进行互相交流的基础协议,有着自己的重要地位。RPC允许一个程序在网络上调用另一个程序中的函数或方法,就像调用本地函数一样。RPC隐藏了底层的网络通信细节,使开发人员能够像本地调用一样进行远程调用。 抖音内部使用的GRPC和Thirft。 下面简单介绍一下Thirft。 Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的IDL定义文件自动生成服务代码框架。用户只要在其之前进行二次开发就行,对于底层的RPC通讯等都是透明的。不过这个对于用户来说的话需要学习特定领域语言这个特性,还是有一定成本的。
分布式存储:分布式存储是指将数据分散存储在多个节点上,以提供更好的可靠性、可扩展性和性能。分布式存储系统可以在物理上分布在不同的服务器、数据中心或云服务中,可以采用各种技术来实现数据的分散存储、复制和访问。微服务之间的数据交互和共享是不可避免的,分布式存储可以帮助处理这些数据管理问题。其中分布式系统中我最熟悉的便是分布式文件系统,下面对其进行简单的介绍。
HDFS(Hadoop Distributed File System)是Apache 设计一种用于存储大规模数据的分布式文件系统。 其主要特点如下:
- 可扩展性: HDFS 能够存储海量的数据,可以通过添加更多的节点来扩展存储容量。数据可以水平分布在集群中的多个节点上。
- 容错性: HDFS 使用数据冗余来实现容错性。数据被分成块(通常为128MB或256MB),并在集群的不同节点上进行备份。当某个节点出现故障时,系统可以自动使用备份数据来恢复。
- 高吞吐量: HDFS 适用于大规模数据处理应用,可以实现高吞吐量的数据读写操作。这使得 HDFS 在大数据分析、批处理和数据仓库等场景中得到广泛应用。
- 适合大文件: HDFS 适合存储大型文件,因为它将文件分成块并分散在多个节点上。对于小文件,可能会造成存储空间的浪费。
- 数据本地性: HDFS 支持数据本地性。数据块会存储在离数据处理节点最近的节点上,从而减少数据传输的开销。
分布式缓存Redis:Redis(Remote Dictionary Server)是一种开源的高性能键值存储系统,它被广泛用于缓存、会话存储、消息队列等场景。其具有如下特点:
-
内存存储: Redis 将数据存储在内存中,因此具有极高的读写性能。这使得 Redis 在需要快速数据访问的应用场景中非常有用。
-
键值存储: Redis 是一种键值存储系统,数据存储以键值对的形式存储。这使得 Redis 适用于存储各种类型的数据,包括字符串、哈希、列表、集合、有序集合等。
-
持久性: Redis 支持多种持久化选项,可以将数据持久化到磁盘上,以便在重启后恢复数据。这使得 Redis 在缓存数据和持久化存储之间取得了平衡。
-
快速: 由于数据存储在内存中,并且 Redis 使用高效的数据结构和算法,因此它具有非常快速的读写性能。在某些情况下,Redis 的性能可以达到每秒百万级别的操作。
-
复制和高可用性: Redis 支持主从复制,可以将主节点的数据复制到多个从节点上,以实现数据备份和高可用性。当主节点失败时,可以将其中一个从节点提升为新的主节点。
内容分发网络CDN:内容分发网络(Content Delivery Network,CDN)是一种分布式网络架构,旨在将内容(如网页、图像、视频、音频等)分布到全球多个服务器节点,以提供更快速、可靠的内容传输和更好的用户体验。CDN 通过将内容存储在离用户更近的服务器上,减少了网络延迟,提高了访问速度,同时可以减轻源服务器的负载。
下面简单介绍一下内容分发网络的特点:
- 缩短访问时间: CDN 将内容分发到全球多个节点,使用户可以从离他们更近的节点访问内容,从而减少了传输时间,提高了网页加载速度。
- 提高性能: 通过将静态资源(如图片、样式表、脚本等)缓存到 CDN 节点上,网站可以在用户请求时从最近的节点提供这些资源,减轻了源服务器的负载,提高了网页性能。
- 提高可用性: CDN 在多个地理位置部署了服务器节点,如果某个节点不可用,用户可以自动被路由到其他可用节点,从而提高了系统的可用性和容错性。
- 减少带宽消耗: CDN 可以在较高的网络带宽上为源服务器提供缓存服务,从而减轻了源服务器的带宽负担。
- 防止 DDoS 攻击: 一些 CDN 提供商提供 DDoS 攻击保护功能,能够帮助抵御分布式拒绝服务(DDoS)攻击,保持网站的可用性。
最后总结一下抖音的互联网架构设计和技术实现实践: 抖音的后端架构采用了微服务架构,借助消息队列、负载均衡、RPC等技术来实现高并发、高可用的服务。分布式存储系统如HDFS被用于存储大规模的数据,而Redis作为分布式缓存则用于加速数据访问和提高性能。此外,抖音利用内容分发网络(CDN)来缩短访问时间、提高性能、提高可用性、减少带宽消耗以及防止DDoS攻击。