Ethan Blog

I am what i am

分布式系统专题第八章-分布式锁

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢? 本章节基于redis的redlock讲解 Redlock 全名叫做 Redis Distributed Lock; 即使用redis实现的分布式锁; 使用场景 多个服务间保证同一时刻同一时间段内同一用户只能有一个...

分布式系统专题第七章-可靠消息最终一致性&最大努力通知

可靠消息最终一致性 可靠消息最终一致性方案是指当事务发起方执行完成本地事务后发出一条消息到消息中间件,事务参与方(消息消费者)一定能够接收到消息并处理事务成功,此方案强调的是只要消息发给事务参与方,则最终事务要达到一致。 假设消息中间件是可靠的 以下内容场景:共有两个微服务交互,用户服务和积分服务,用户服务负责添加用户,积分服务负责增加积分。 以下内容使用RocketMQ作为演...

分布式系统专题第六章-TCC

2PC 和 3PC 都是数据库层面的,而 TCC 是业务层面的分布式事务,就像我前面说的分布式事务不仅仅包括数据库的操作,还包括发送短信等,这时候 TCC 就派上用场了 TCC又称补偿事务。其核心思想是:”针对每个操作都要注册一个与其对应的确认和补偿(撤销操作)” 什么是TCC事务 TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理...

分布式系统专题第五章-3PC

三阶段提交协议(3PC)主要是为了解决两阶段提交协议的阻塞问题,2pc存在的问题是当协调者崩溃时,参与者不能做出最后的选择。因此参与者可能在协调者恢复之前保持阻塞。三阶段提交(Three-phase commit),是二阶段提交(2PC)的改进版本。 与两阶段提交不同的是,三阶段提交有两个改动点。 1、 引入超时机制。同时在协调者和参与者中都引入超时机制。 2、 在第一阶...

分布式系统专题第四章-2PC

前面已经学习了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知这几种。 两段式提交(2PC) 两阶段提交又称2PC,2PC是一个非常经典的强一致、中心化的原子提交协议 中心化是指协议中有两类节点,即一个协调者(coordinator)和N个参与者(partcipant) 两个阶段是指第一阶段:投票...

分布式系统专题第三章-BASE理论

BASE理论 BASE理论是对CAP中AP的一个扩展,通过牺牲强一致性来获得可用性,当出现故障允许部分不可用但要保证核心功能可用,允许数据在一段时间内是不一致的,但最终一致性。满足BASE理论的事务,我们称之为“柔性事务”。 BASE是指: 基本可用(Basically Available) 基本可用是指分布式系统在出现故障的时候,允许损失部分可用性(例如响应时间、功能上的可...

分布式系统专题第二章-CAP理论

CAP理论 CAP理论在互联网界有着广泛的知名度,知识稍微宽泛一点的工程师都会把其作为衡量系统设计的准则。大家都非常清楚地理解了CAP:任何分布式系统在可用性、一致性、分区容错性方面,不能兼得,最多只能得其二,因此,任何分布式系统的设计只是在三者中的不同取舍而已。 CAP是 Consistency、Availability、Partition tolerance三个词语的缩写,分别...

分布式系统专题第一章-序篇

从本章开始讨论分布式的问题和解决方案 一、基础概念 1.1 本地事务 在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。 1.2 分布式事务 随着互联网的快速发展,软件系统由原来的单体应用转变为分布式应用。 ...

实现一个微信红包金额分配算法

实现一个类似微信的红包金额分配算法,例如小明在群里发了100元红包,设定10个人分,每个人抢到的金额随机分配。 1.所有人抢到的金额之和要等于红包金额,不能多也不能少。 2.每个人至少抢到1分钱。 3.要保证红包拆分的金额尽可能分布均衡,不要出现两极分化太严重的情况。 二倍均值法 就是把每次随机金额的上限定为剩余人均金额的2倍 假设当前红包金额为m元,剩余人数为n人,那么公式为: ...

使用docker-compose编排golang

演示如何使用docker-compose来编排运行golang web服务,容器包括nginx,golang,redis,访问nginx暴露的9999端口,由nginx代理到web服务的8888端口中。 代码演示 1、docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2...