开源协议
开源协议概述开源协议是规定软件源代码如何被使用、修改和分发的法律文本。这些协议为开发者提供了在保持源代码开放的同时,规定了一些使用条件和责任。以下是一些常见的开源协议:
主流协议
GNU通用公共许可证(GNU General Public License,GPL):
特点:软件的使用是免费的,强调用户有权查看、修改和重新分发源代码。如果您修改了代码并重新分发,您的修改必须也是开源的。
版本:GPL有不同的版本,包括GPLv2和GPLv3。
场景:适用于二次或N次开发,那么发布时要带上源码,让其传播,所以它最终的版权是大众的,而非某一个人的,因此不用交钱就可以使用。
MIT许可证:
特点:目前限制最少的开源许可协议之一(比BSD和Apache的限制都少),只要程序的开发者在修改后的源代码中保留原作者的许可信息即可,简单且自由度较高。允许在源代码中包含此许可证,允许任何人免费使用、修改和分发您的代码,只需保留原始许可证和版权声明。
场景:普遍被商业软件所使用。
Apache许可证:
特点:Apache协议具体为许可证版本(Apache License Version)协议,Ap ...
数据迁移细节
数据迁移细节数据迁移运用场景:
重构项目但数据不能丢失,需要重新设计表结构
单库拆分分库分表
数据备份工具
mysqldump:一个用于备份和恢复 MySQL 数据库的命令行工具。它允许用户导出 MySQL 数据库的结构、数据以及表之间的关系,以便在数据库发生问题时进行恢复。它是一个逻辑备份工具,导出的内容是一条条 SQL。
XtraBackup:它使用了 InnoDB 存储引擎的数据备份技术,支持增量备份和恢复,并且支持多主机备份和恢复。它是一个物理备份工具,相当于直接复制 InnoDB 的底层存储文件。
innodb_autoinc_lock_mode 是 InnoDB 引擎里面控制自增主键生成策略的参数,它有三个取值。
0:使用表自增锁,但是锁在 INSERT 语句结束之后就释放了。
1:使用表自增锁,如果是普通的 INSERT INTO VALUE 或者 INSERT INTO VALUES 语句,申请了主键就释放锁,而不是整个 INSERT 语句执行完毕才释放。如果是 INSERT SELECT 等语句,因为无法确定究竟要插入多少行,所以都是整个 INSERT 语 ...
高并发系统设计目标
系统设计目标高并发系统设计的三大目标:高性能、高可用、可扩展。
高性能:保证系统能够承载高并发的前提。
高可用:防止系统隔三差五宕机维护停机。
可扩展:保证能够在短时间内迅速完成扩容,更加平稳地承担峰值流量。
提升系统性能性能优化原则
性能优化一定不能盲目,一定是问题导向的。
脱离了问题,盲目地提早优化会增加系统的复杂度,浪费开发人员的时间,也因为某些优化可能会对业务上有些折中的考虑,所以也会损伤业务。
性能优化也遵循“八二原则”。
在优化过程中一定要抓住主要矛盾,优先优化主要的性能瓶颈点。
性能优化也要有数据支撑。
一定要把性能监控系统做好,在优化过程中,时刻关注优化效果。
性能优化的过程是持续的。
高并发的系统通常是业务逻辑相对复杂的系统,在优化过程中需要循序渐进,不断寻找性能瓶颈并优化。
性能的度量指标性能的度量指标主要用于明确性能问题、评估优化效果。
度量性能的指标是系统接口的响应时间,但是单次的响应时间是没有意义的,需要知道一段时间的性能情况是什么样的,主要的统计特征值有:
平均值
平均值是把这段时间所有请求的响应时间数据相加,再除以总请求数。但是不能真实反应 ...
架构分层
架构分层软件架构分层在软件工程中是一种常见的设计方式,它是将整体系统拆分成 N 个层次,每个层次有独立的职责,多个层次协同提供完整的功能。
常见分层架构MVC(Model-View-Controller)架构
它将整体的系统分成了 Model(模型),View(视图)和 Controller(控制器)三个层次,也就是将用户视图和业务处理隔离开,并且通过控制器连接起来,很好地实现了表现和逻辑的解耦,是一种标准的软件分层架构。
另外一种常见的分层方式是将整体架构分为表现层、逻辑层和数据访问层:
表现层,顾名思义嘛,就是展示数据结果和接受用户指令的,是最靠近用户的一层;
逻辑层里面有复杂业务的具体实现;
数据访问层则是主要处理和存储之间的交互。
计网中的 TCP/IP四层模型:
分为链路层、网络层、传输层和应用层
每一层各司其职又互相帮助,网络层负责端到端的寻址和建立连接,传输层负责端到端的数据传输等,同时相邻两层还会有数据的交互。这样可以隔离关注点,让不同的层专注做不同的事情。
分层的优缺点优点:
首先分层的设计简化了系统设计,让人各司其职只关注某一层的事情。
再次就是提高了 ...
高并发系统通用设计方法
高并发系统通用设计方法概述在应对高并发大流量时主要有三种方法:
Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和流量。
缓存:使用缓存来提高系统的性能,就好比用“拓宽河道”的方式抵抗高并发大流量的冲击。
异步:在某些场景下,未处理完成之前我们可以让请求先返回,在数据准备好之后再通知请求方,这样可以在单位时间内处理更多的请求。
Scale-out(横向扩展)这个方案的思想来源于CPU的发展,从单CPU到多核CPU;由于单CPU的工艺无法再有所突破,则将多个 CPU 核心压在一个芯片上,从而大大提升 CPU 的并行处理能力。其中单CPU的性能突破叫做Scale-up(纵向扩展),多核心的思想叫做Scale-out(横向扩展)。
Scale-up(纵向扩展):
通过不断提高单体性能的思想,比如升级单台服务器硬件。这种方案简单方便。
Scale-out(横向扩展):
通过将多个低性能的机器组成一个分布式集群来共同抵御高并发流量的冲击。但是引入了多节点管理的问题。
缓存缓存的思想遍布系统设计的每个 ...
经典限流算法
经典限流算法前述限流算法是一种用于控制流量或请求访问频率的技术,广泛应用于各种场景,以确保系统的稳定性和可用性。
现代互联网很多业务场景,比如秒杀、下单、查询商品详情。这些只是一些限流算法应用的示例,实际上,几乎任何需要控制流量或请求速率的应用都可以从限流算法中受益。选择适当的限流算法取决于具体的需求和系统架构。常见的限流算法包括令牌桶算法、漏桶算法、计数器算法等。
算法详解计数器算法计数器算法是一种基于计数器的限流方法。它通过维护一个计数器来记录请求的数量,并与预设的阈值进行比较。
当计数器超过阈值时,就会触发限流操作。可以根据需要选择计数器的精度(例如每秒、每分钟等)以及阈值的设置。
缺点:
临界问题:例如在临界两把突发的高峰,无法进行限制。
滑动窗口算法滑动窗口,又称rolling window。滑动窗口算法维护一个固定大小的时间窗口,通常使用队列或数组来记录请求的时间戳。
请求进入窗口时,旧的时间戳会被移出,从而保持窗口内的请求数量在限制范围内。
滑动窗口解决了计数器算法的临界值问题。
缺点:
不适用于长时间限流:滑动窗口算法通常用于实时或较短时间的限流,例如每秒 ...
数据迁移
数据迁移迁移数据方案迁移过程也需要满足以下几个目标:
迁移应该是在线的迁移,也就是在迁移的同时还会有数据的写入;
数据应该保证完整性,也就是说在迁移之后需要保证新的库和旧的库的数据是一致的;
迁移的过程需要做到可以回滚,这样一旦迁移的过程中出现问题,可以立刻回滚到源库不会对系统的可用性造成影响。
“双写”方案第一种方案我称之为双写,其实说起来也很简单,它可以分为以下几个步骤:
将新的库配置为源库的从库用来同步数据;如果需要将数据同步到多库多表,那么可以使用一些第三方工具获取 Binlog 的增量日志(比如开源工具 Canal),在获取增量日志之后就可以按照分库分表的逻辑写入到新的库表中了。
同时我们需要改造业务代码,在数据写入的时候不仅要写入旧库也要写入新库。当然,基于性能的考虑,我们可以异步地写入新库,只要保证旧库写入成功即可。但是我们需要注意的是,需要将写入新库失败的数据记录在单独的日志中,这样方便后续对这些数据补写,保证新库和旧库的数据一致性。
然后我们就可以开始校验数据了。由于数据库中数据量很大,做全量的数据校验不太现实。你可以抽取部分数据,具体数据量依据总体数据量而 ...
接口幂等性
接口幂等性概述接口幂等性(Idempotence)是计算机科学和网络通信领域的一个重要概念,用于描述某个操作可以重复执行多次而不会产生不同的结果。幂等性是设计和开发网络服务和API时的重要原则之一,特别是在处理与数据修改相关的操作时,以确保系统的可靠性和一致性。
实现方式设计幂等性的API对于分布式系统的可靠性和容错性至关重要。它允许客户端在网络通信中重试操作,而无需担心产生不一致的结果。在API设计中,可以通过以下方式来确保幂等性:
幂等性检查:在处理请求之前,服务器可以检查请求的幂等性,以确保不会产生意外的结果。
缺点:
前置判断地方太多,容易遗留
干扰正常业务编写
构建幂等表:
关键点:
请求的请求头中必须带有唯一请求id
判断是否在Redis中存在,不存在则存入Redis(格式为:系统-Id:请求状态:过期时间)
数据服务完成请求需要修改Redis中该请求的状态(利用AOP进行后置通知更新)
缺点:
前台应用需要进行改造
架构复杂度增加
分布式一致性算法
分布式一致性算法概述分布式一致性算法是一组用于确保分布式系统中数据一致性的算法。这些算法旨在解决多个节点之间的数据同步和一致性问题,以确保在分布式环境中的各个节点上的数据副本保持一致。
一些常见的分布式一致性算法包括:
Paxos算法:Paxos算法是一种经典的分布式一致性算法,用于确保在网络中多个节点之间达成一致性协议。
Raft算法:Raft算法是另一种用于分布式一致性的算法,它的设计更加容易理解和实现,适用于构建可靠的分布式系统。
ZAB 算法:ZAB(ZooKeeper Atomic Broadcast)选举算法是为 ZooKeeper 实现分布式协调功能而设计的。
Gossip算法:Gossip算法,是一种分布式计算中常用的算法,它用于在一个分布式系统中传播信息或数据,以实现数据的一致性和同步。
算法简单介绍Paxos算法Paxos算法是一种分布式一致性算法,用于在分布式系统中达成一致的共识。它是由Leslie Lamport于1990年提出的,被认为是分布式系统领域的经典算法之一。Paxos算法的主要目标是允许多个节点在面对故障和网络延迟的情况下,达成共识,确保数据的一 ...
多级缓存架构
多级缓存架构分布式多久缓存架构概述分布式缓存架构是一种用于提高应用程序性能和可伸缩性的计算机架构,它利用分布式计算资源和存储资源来管理和存储数据的缓存。这种架构的主要目标是减轻数据库或其他后端存储系统的负载,从而加快数据访问速度并提高系统的可伸缩性。
架构图:
一共分为四层:客户端层、应用层、服务层、数据层;
各层缓存客户端层:客户端层的缓存通常是通过浏览器进行管理,它使用响应头中的一些字段来控制缓存行为,将静态文件缓存在客户端本地。
这些字段包括:
Cache-Control: 这个响应头字段包含了各种指令,以告诉浏览器如何处理响应的缓存。
max-age:指定了资源在被认为过期之前可以被缓存的秒数。例如,max-age=3600表示资源可以在浏览器缓存中存储一个小时。
no-cache:表示缓存必须重新验证资源的有效性,但仍然可以缓存。
no-store:表示不允许缓存该资源。
public:表示该响应可以被任何缓存存储,包括中间代理服务器。
private:表示响应只能被单个用户的浏览器缓存,而不能被共享缓存。
Expires: 这个响应头字段包含了一个日期/时间值,表 ...