一个大型系统有哪些组件构成?
系统设计往往有很多相似之处,但是细节的地方都是独一无二的。那我们可以把系统设计中这些相似的地方抽离出来作为基础组件,让系统设计变成搭积木。接下来,我会把一个系统设计中可以抽离出哪些通用的组件列举出来。然后一一分析阐述。
域名系统(Domain Name System)
各种不同的计算机都能够在互联网的世界被发现。那每个设备都需要唯一的标识码,不然这些计算机就都乱套了。因此域名系统的作用就是这个,为互联网的设备设计分层和分布式的命名系统。每一个大型系统也会在域名系统中有自己的一席之地。
负载均衡(Load Balance)
一个系统为了扛住大的访问量,那肯定不止一台服务器,所以,如何公平的分配流量到多台服务器,甚至绕开有故障的服务器,这就需要负载均衡了。
数据库(Database)
这个不用多说,数据库让我们有了存储,检索,修改,和删除数据的能力。后面我们会讨论关于数据库的副本,分区和分布式数据库的分析。
键值对存储(Key-Value Store)
这是一个非关系型数据库,那为什么还需要一个键值对存储呢?后面,我们将具体解释键值存储的设计以及实现可扩展性、耐用性和可配置性等重要概念。
内容分发网络(Content Delivery Network)
CDN的主要作用是为了高效率,低延迟的分发内容,例如图片,视频,音频还有一些网页静态资源等等。
定序器(Sequencer)
无论是我们的请求,还是各种数据都需要一个唯一ID。那定序器就是为了生产随机的唯一ID,并且是全局唯一。
服务监控(Service Monitoring)
监控系统对分布式系统至关重要,因为它有助于分析系统,并在出现问题时发出警报。监控系统通常对预警系统非常有用,这样系统管理员就能在即将发生的问题变成大问题之前采取行动。在这里,我们将建立两个监控系统,一个用于服务器端,另一个用于客户端错误。
分布式缓存(Distributed Caching)
分布式缓存能够协调存储频繁访问的数据或者用作分布式锁等等。
分布式消息队列(Distributed Messaging Queue)
分布式消息队列帮助生产者和消费者分离,从而提升课扩展性和可靠性。
发布-订阅系统(Publish-Subscribe System)
发布-订阅系统是一个异步的服务-服务之间关联的系统。这个系统在微服务架构,数据处理系统中非常受欢迎。
访问限制(Rate Limiter)
该系统用于根据预定义的限制来节流对服务的传入请求。它通常用作服务的防御层,以避免服务被过度使用。
Blob 存储
这个存储区别于Database,Blob主要用于存储多文件和二进制可执行文件等等等。
分布式查找(Distributed Search)
搜索系统接收用户的查询,并在几秒钟或更短时间内返回相关内容。
分布式日志(Distributed Logging)
日式是一个I/O频繁且耗时的操作。分布式日志目的就是为了高效的记录这些日志。并且日志系统易于扩展和可靠性高。
分布式任务计划(Distributed Task Scheduling)
我们将设计一个分布式任务调度系统,在任务和资源之间进行调解。它能智能地为任务分配资源,以实现任务级和系统级目标。它通常用于卸载后台处理,以异步方式完成。
分片计数器(Sharded Counters)
该计数器用于解决百万兵法的读写请求,比如文章点赞系统。
需求分类
功能需求:是指设计系统的用户能够使用的功能。例如,系统将允许用户使用搜索栏搜索内容。
非功能性需求(NFR):非功能性需求是系统用户认为系统可用的标准。非功能需求可能包括高可用性、低延迟、可扩展性等要求。