腾讯开源的 Paxos库 PhxPaxos 代码解读---Accept阶段(一)
腾讯开源的 Paxos库 PhxPaxos 代码解读---Accept阶段(一)
在看Accept阶段代码之前, 我们再回想一下 Basic Paxos算法;
1. Basic Paxos 算法是为了使集群中的Acceptor们达成一个最终的值, 或者不能达成一个最终的值;
就是说, 要么达成一个最终的值, 某个时间点上, 多数派节点都是一个一致的值, 这个值就是最终的值;
否则, 没有多数派在某个时间点达成一个一致的值, 这个值不断被新的提议(Proposal)刷新, 无法达成最终值;
这种情况一般意味着发生了活锁;
2. 一个最终的值一旦被确定, 不能再有Proposor发出提议进行修改, 为了确保这点, 有了针对Proposor的约束:
Proposor必须收到多数派的响应, 才能进行Accept提议; 原因如下:
Proposor只有收到多数派响应消息, 才能确定是否已经有多数派接受过提议(Proposal),
如果多数派响应消息里面已经携带了接受过的提议, 则有两种可能:
1. 多数派已经已经达成了一致, 必然会有某些Acceptor的响应携带了这个值;
2. 多数派还没有达成一致, 但是Proposor正好收到了某个已经接受过提议的Acceptor的响应;
上述情况不论是哪种, Proposor都需要用已有的提议发起Accept请求, 选择最大ProposolID的那个;
这样是为了促使Acceptor们尽快的达成一致;
3. 对于Acceptor的约束, 则是必须要大于等于当前已经接受过的最大ProposalID, 才能刷新这个值,;
我们给出一个典型的场景来说明, 以3个Acceptor为例:
第1个时间片段:
Proposor1发起Prepare请求(1, null), 成功到达 Acceptor1和Acceptor2, Acceptor的状态如下:
Acceptor1(1, null); Acceptor2(1, null); Acceptor3(null, null)
第2个时间片段:
Proposor2发起Prepare请求(2, null), 成功到达 Acceptor1和Acceptor2, Acceptor的状态如下:
Acceptor1(2, null); Acceptor2(2, null); Acceptor3(null, null)
第3个时间片段:
Proposor1发起Accept请求(1, 100), 1 < 2, 被Acceptor拒绝, Acceptor的状态如下:
Acceptor1(2, null); Acceptor2(2, null); Acceptor3(null, null)
第4个时间片段:
Proposor2发起Accept请求(2, 100), 2=2, 被Acceptor接受, Acceptor的状态如下:
Acceptor1(2, 100); Acceptor2(2, 100); Acceptor3(null, null)
第5个时间片段:
Proposor1重新发起Prepare请求(3, null), 到达Acceptor2和Acceptor3,
收到响应之后, 用Acceptor2接受的值发起Accept请求(2,100),成功到达Acceptor2和Acceptor3,
状态变为如下:
Acceptor1(2, 100); Acceptor2(2, 100); Acceptor3(2, 100)
在处理Prepare和Accept请求时, 我们不仅要考虑网络中的异步情况, 还要考虑在接受一个提议时代码执行的异步情况;
前面一篇博客已经简单介绍过phxpaxos中Prepare阶段的代码, 下面简单的介绍一下Accept阶段的代码;
phxpaxos\src\algorithm\proposer.cpp
这里的代码是Proposor的逻辑
phxpaxos\src\algorithm\acceptor.cpp
这里的代码是Acceptor的逻辑
下面的图是Proposor发起Accept请求的操作:
下面的图是Acceptor收到Accept请求的操作:
下面的图是Propsor收到Acceptor返回响应的操作:
结束:
微信开源的Paxos库有很多照顾性能的实现, 后面慢慢讲吧;
腾讯开源的 Paxos库 PhxPaxos 代码解读---Accept阶段(一)的更多相关文章
- 腾讯开源的Paxos库PhxPaxos代码解读---Prepare阶段(一)
简单的画了一下PhxPaxos在Prepare阶段的逻辑,主要是正常的逻辑,异常逻辑和超时后面再写了; 熟悉PhxPaxos代码最好的方法是编译运行sample目录下的三个例子,编译方法在另一篇博客已 ...
- 腾讯开源项目phxpaxos的编译步骤
#paxos的一般编译流程在项目文档<中文详细编译手册>里面已经有介绍,这里重点介绍一下编译samples目录下的代码: #我的环境是ubuntu; #设置paxos根目录 phx_dir ...
- iOS、mac开源项目及库汇总
原文地址:http://blog.csdn.net/qq_26359763/article/details/51076499 iOS每日一记------------之 中级完美大整理 iOS.m ...
- 腾讯开源手游热更新方案,Unity3D下的Lua编程
原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...
- 微信自研生产级paxos类库PhxPaxos实现原理介绍
转载自: http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483695&idx=1&sn=91ea4229 ...
- 广告行业中那些趣事系列7:实战腾讯开源的文本分类项目NeuralClassifier
摘要:本篇主要分享腾讯开源的文本分类项目NeuralClassifier.虽然实际项目中使用BERT进行文本分类,但是在不同的场景下我们可能还需要使用其他的文本分类算法,比如TextCNN.RCNN等 ...
- Win10 UWP开发系列——开源控件库:UWPCommunityToolkit
在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在G ...
- Cowboy 开源 WebSocket 网络库
Cowboy.WebSockets 是一个托管在 GitHub 上的基于 .NET/C# 实现的开源 WebSocket 网络库,其完整的实现了 RFC 6455 (The WebSocket Pro ...
- java开源时间/日期库Joda-Time
任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛苦和繁琐.现在来看看 Joda Time,一 ...
随机推荐
- Sublime Text 3 插件
1.快捷键:ctrl+shift+P 2.输入install package,选择install package 3.输入需要安装的插件,选择安装 4.重启sublime 1. 格式化 html-cs ...
- 深入理解Java虚拟机读书笔记4----虚拟机类加载机制
四 虚拟机类加载机制 1 类加载机制 ---概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型. -- ...
- leetcode974
这道题目描述很清晰,直接两层循环,代码如下: class Solution(object): def subarraysDivByK(self, A: 'List[int]', K: int) -&g ...
- Django12-ModelForm中创建局部钩子和全局钩子
一.局部钩子 命名规则为clean_对象名称,例如上面定义了username.pwd对象,那么可以定义clean_username.clean_pwd的局部钩子进行规则校验 1.例子:定义一个手机号校 ...
- 什么是P2P流标
1.被动流标:在规定的投标时间内,一般是7天,没有凑齐这笔借款,就流标了: 2.主动流标:借款人或平台原因,将为投满的标下架,做流标处理 介绍: 对于投资者来说,在投资P2P理财的时候,可能会遇到过流 ...
- MyEclipse和eclipse生成变量快捷键
MyEclipse和eclipse生成变量快捷键MyEclipse和eclipse生成变量快捷键 一.MyEclipse快捷生成变量(两种):第一种: 光标放在该行的任意位置,按 Ctrl+2,会弹出 ...
- 实现硬件PWM控制电机旋转和通过编码器计算所转圈数的简单例程
该例程所用的硬件设备: 直流电机驱动模块YYH-LWZ: H桥 大功率 正反转 刹车 PWM 调速 5/12/24V 12V直流减速电机JGB37-520B:ASLONG JGB37-520B编码器减 ...
- ARTS打卡计划第二周-Algorithm
665. 非递减数列 https://leetcode-cn.com/problems/non-decreasing-array/ 给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元 ...
- sql server数据库文件的迁移(mdf&ldf文件)
mdf 源文件 ldf 日志文件 在服务器不同磁盘目录内做迁移.移动用户数据库文件的情况大致有下面一些: ① 没有设计规划好,贪图方便,,,,数据库文件和日志文件增长过快,导致存放数据库文件的磁盘空间 ...
- Python学习—基础篇之基本数据类型(二)
Python中重要的数据结构 1.列表 2.元组 3.字典 4.集合 列表 1.创建列表 # 方式一 name = [] print(type(name)) # 执行结果 >>> & ...