随笔分类 - 分布式系统
摘要:前言 以前还傻傻的自己写分布式锁实现:基于缓存或 zookeeper 的分布式锁实现。果然,你能想到的轮子,99% 都已经有人造好了,并且,比你自己造的好的多。 RedisLockRegistry 依赖 implementation("org.springframework.boot:spring-
阅读全文
摘要:一 前言 传统的静态配置方式想要修改某个配置时,必须重新启动一次应用,如果是数据库连接串的变更,那可能还容易接受一些,但如果变更的是一些运行时实时感知的配置,如某个功能项的开关,重启应用就显得有点大动干戈了。配置中心正是为了解决此类问题应运而生的,特别是在微服务架构体系中,更倾向于使用配置中心来统一
阅读全文
摘要:我们介绍一种基于数据库维护自增 ID 区间,结合内存分配的策略,这也是淘宝的 TDDL 等数据库中间件使用的主键生成策略。 使用这种方式首先在数据库中创建 sequence 表,其中的每一行,用于记录某个业务主键当前已经被占用的 ID 区间的最大值。sequence 表的主要字段是 name 和 v
阅读全文
摘要:1、在大型集群中每日宕机发生的概率为千分之一左右;在实践中,一台宕机的机器恢复时间通常认为是 24 小时。 2、由于网络数据丢失的异常存在,直接决定了分布式系统的协议必须能处理网络数据丢失的情况。 3、如果某些节点的直接的网络通信正常或丢包率在合理范围内,而某些节点之间始终无法正常通信,则称这种特殊
阅读全文
摘要:一、简介 Paxos 协议是少数在工程实践中证实的强一致性、高可用的去中心化分布式协议。Google 的很多大型分布式系统都采用了 Paxos 算法来解决分布式一致性问题,如 Chubby、Megastore 以及 Spanner 等。开源的 ZooKeeper 以及 MySQL 5.7 推出的用来
阅读全文
摘要:一、Lease 机制 Lease 机制是最重要的分布式协议,广泛应用于各种实际的分布式系统中。即使在某些系统中相似的设计不被称为 Lease,但我们可以分析发现其本质就是一种 Lease 的实现。 Lease 机制的定义如下:lease 是由颁发者授予的在某一有效期内的承诺。颁发者一旦发出 leas
阅读全文
摘要:一、概述 分布式 ID 生成算法的有很多种,Twitter 的 SnowFlake 就是其中经典的一种。 SnowFlake 算法生成 ID 的结果是一个 64bit 大小的整数,它的结构如下图: 1 位,不用。二进制中最高位为 1 的都是负数,但是我们生成的 id 一般都使用整数,所以这个最高位固
阅读全文
摘要:一、读写分离概述 基本架构图: 二、适用场景 读写分离不是银弹,并不是一有性能问题就上读写分离,而是应该先优化,例如优化慢查询,调整不合理的业务逻辑,引入缓存查询等只有确定系统没有优化空间后才考虑读写分离集群。 三、引入的系统复杂度问题 1. 主从复制延迟 2. 分配机制 如何将读写操作区分开来,然
阅读全文
摘要:一、概念 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。 常用的限流算法有三种:计数器法、漏桶算法和令牌桶算法: 计数器法是限流算法中最简单的一种算法,我们维护一个时间窗口比如 100s,设定阈值 10
阅读全文
摘要:缓存锁 我们常常将缓存作为分布式锁的解决方案,但是却不能单纯的判断某个 key 是否存在 来作为锁的获得依据,因为无论是 exists 和 get 命名都不是线程安全的,都无法保证只有一个线程可以获得锁,存在线程争抢,可能会有多个线程同时拿到锁的情况(经典的 Redis “读后写”的问题)。 inc
阅读全文
摘要:一、概述 开始阅读这篇文章之前,建议先阅读下 "《SpringBoot 之Actuator》" ,该篇文章提到 Spring Boot Actuator 提供了对单个Spring Boot的监控,信息包含:应用状态、内存、线程、堆栈等等,比较全面的监控了Spring Boot应用的整个生命周期。但是
阅读全文
摘要:一、概念和原理 RPC(remote procedure call),远程过程调用,是客户端应用和服务端之间的会话。在客户端,它所需要的一些功能并不在该应用的实现范围之内,所以应用要向提供这些功能的其他系统寻求帮助。而远程应用通过远程服务暴露这些功能。RPC 是同步操作,会阻塞调用代码的执行,直到被
阅读全文