分布式系统的时间顺序
链客,专为开发者而生,有问必答!
此文章来自区块链技术社区,未经允许拒绝转载。
分布式系统的时间顺序
区块链被认为是分布式的系统,分布式系统中由于多节点,通讯、物理位置等的问题,各节点间时间一致的问题随即也被提了出来,那么怎么处理分布式系统中的一致性问题,这里简单介绍下:分布式系统的时间顺序问题。如有解释错误或者不明,请及时提出指正。
分布式系统,最简单理解有多个服务节点,客户端发出请求,服务节点之间通讯,顺序记录更新服务器数据和日志。
分布式系统中的时间问题,如果简单去想,那么通过NTP时间同步,所有节点都通过去同步时间,然后根据进程发起的物理时间来排序,先不论时间同步中同步过程中的细微毫秒级差异,多个业务发起进程,在各个进程之间有关联关系,进程随着系统计算能力有差异,并且还有检查点的判断,一旦在顺序进程中出现了前物理时间某进程改变了检查点,那么在认为是同步处理的时候就会出现检查点状态改变导致业务逻辑的改变,这种情况理解下就是你在购物网站抢购的时候,货物剩余量在你发起交易的时候还有,但是确认过程由于网络和计算的延时,发现分布式系统中一边是交易已正常请求,但是实际货物记录中已下架。引入logical clock能较好的处理这种系统记录逻辑混乱的现象。
Logical clock称为lamport timestamps,这种概念里,先把分布式系统节点间交互分成三种类型:
1.分布式单个节点自己内部传递的事件。
2.分布式节点互相之间传递的事件。
3.分布式节点接收除自己之外的传递进来的事件。
同时再加一个逻辑时间顺序概念。
顺序叠加原则:这里整个系统顺序逻辑时间时间为T(),各个节点顺序为X()
1.初始发起节点为0.
2.节点内传递,X+1
3.节点间传递,T+1
4.节点接收除自己之外的传递(T and X)+1
那么如果再定义一个节点事件顺序,对节点A.B.C排序。假定发生顺序A<B<C,在上图中,事件发生顺序为:
C-1(T=1) B-1(T=2) B2(T=3) A1(T=4) A2(T=5) B4(T=6) B5(T=7) C4(T=8) C5(T=9) A4(T=10)
B-3(T=4) C-2(T=5) C-3(T=6) A-3(T=7)
问题来了T(4.5.6.7)发生了重复,那么就用之前说的A<B<C原则
以B-4和C-3作比较:A<B<C,那么B-4就理解为发生在C-3之前。推导B-4–>C-3。B-4发生在C-3之前。这个前提是我们已知三个节点进程发生的关系顺序,在实际情况下这个也有可能是很难进行判断的。所以对于并发情况没有很好的一致性判断。
上述图中节点A.B.C也可理解为各个进程的顺序,在整个logiccal clock中有这么一个概念要明确,进程间没有因果关系,那就认为是并发,没有因果关系对于系统来说对事件的顺序前后就没有那么强烈的需求,前提是要确定确实没有因果关系,那么分布式系统中就认为是正确的。所以归纳下,分布式系统中没有因果顺序的并发时间就不关注先后顺序。
介绍到这里,会提出一个疑问,上面也提到了,那么系统中并发怎么处理,之前通过进程顺序来排序,但是这种不是真正好的为并发处理时间顺序,在这个问题上先提出Vector clock,这是在之前lamport时间戳的一种改进逻辑时钟。
在vector clock中对每一个事件上加上前一事件的序号,那么可以看到每个事件记录是一组向量。比如:(A-2 B-4 C-1),(A-2 B-5 C-4)。
1
在这种方式中,还要引入分布式系统中读写的概念,不单单是事件的传递,设定N为节点数量,R为成功读的节点,W为成功写的节点。
当W+R>N,那么就可以保证一致。
说明流程:(w为写入进程,a,b,c,d为节点)
1.客户端写入数据,提交到服务端。
2.服务端创建一个顺序编号,例:(w-a-1)
3.客户端再请求写入数据,生成编号:(w-a-2)
4.多次请求生成,(w-a-2)(w-b-1),(w-a-2)(w-b-1),(w-a-2)(w-d-1)
5.多次请求后,再次读到(w-a-2),那么认为(w-b-1)(w-c-1)(w-d-1)存在冲突,最终通过一致性解决方案生成(w-a-3)(w-b-1)(w-b-1)(w-d-1)写入。
Vector clock用来发现数据的冲突,并配合其他的方式来解决冲突,现在常用的会用最后更新原则来做处理,保持一致性。
这里大致介绍了两种分布式系统的时间顺序处理,分布式系统因为其特殊性,需要各种机制来保证一致性和高效率执行。
相关文章:

JVM 老年代对象来源
一般情况是四种,但是尤其以第一种来源最多1.新生代对象每经历依次minor gc,年龄会加一,当达到年龄阀值会直接进入老年代。阀值大小一般为152.Survivor空间中年龄所有对象大小的总和大于survivor空间的一半,年龄大于或等于该年龄的…

[心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连...
此文讲述的内容是一个实际项目开发中的一部分内容,笔者将亲身经历写成文章。 【背景】 现 需要实现这样的功能:有多个客户端连着同一个服务器。服务器和客户端之间需要“互相”知道彼此的连接状态。比如在某一时刻,服务器需要知道当前有多少个…

python绝对值编程_Python-abs vs fabs
编辑:正如aix所建议的,比较速度差异的更好(更公平)方法是:In [1]: %timeit abs(5) 10000000 loops, best of 3: 86.5 ns per loop In [2]: from math import fabs In [3]: %timeit fabs(5) 10000000 loops, best of 3:…

如何搭建以太坊私有链
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 如何搭建以太坊私有链1 今天讲一下如何搭建以太坊私有连,当然了在你阅读这篇文章的时候,最好是有一定基础,比如…

Autocomplete 自动补全(Webform实战篇)
开篇语 因为项目中需要用到一个自动补全的功能,功能描述: 需求一:新增收件人的时候,自动下拉显示出数据库中所有的收件人信息(显示的信息包括:姓名-收件地址-联系方式) 需求二:选中一…

前端开发基础7(Bootstrap框架)
Bootstrap介绍 Bootstrap是Twitter开源的基于HTML、CSS、JavaScript的前端框架。 它是为实现快速开发Web应用程序而设计的一套前端工具包。 它支持响应式布局,并且在V3版本之后坚持移动设备优先。 为什么要使用Bootstrap? 在Bootstrap出现之前࿱…

python自动化测试难不难_Python测试自动化好学还是Pythonweb开发好学?
还是测试吧。。。 用动态语言搞开发,项目大了根本没法维护,而且还会bug层出不穷,任谁也Hold不住。真想搞开发,要么玩Java,要么玩C#。 下面举个例子。 比如一个游戏项目,是这样的(伪代码):角色 l…

以太坊智能合约开发第二篇:理解以太坊相关概念
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 很多人都说比特币是区块链1.0,以太坊是区块链2.0。在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成…

【python之旅】python的基础二
一、集合的操作 1、什么是集合? 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重:把一个列表变成集合,就自动去重关系测试:测试两组数据之前的交集,差集,并集…

hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?
前言大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗?今天带大家来了解一下equals和hashcode重写的实现。set是如何去重的?…

LazyT 延迟加载
namespace ConsoleAppTest {class Program{static void Main(string[] args){Lazy<Student> student new Lazy<Student>();//默认未初始化Console.WriteLine(student);//在第一次使用时才实例化Console.WriteLine(student.Value);Console.ReadLine();}public clas…

如何编写一个可升级的智能合约
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 如何编写一个可升级的智能合约 区块链信任基础的数据不可修改的特性,让它传统应用程序有一个很大的不同的地方是一经发布于区块链上就…

用ILSpy查看Session.SessionID的生成算法
缘由 asp.net Session在InProc模式下,容易丢失,经常需要重新登录,且不支持分布式共享。 所以在研究Redis实现原生的Session,本来想用GUID作为key存入cookie,又在想能不能实现跟Session一样的id 实现 ILSpy 是一个开源的.NET反…

java 中 bean 的生命周期
java 中 bean 的生命周期 本篇中会对涉及到的知识点皆做出描述: 首先,我们先了解先虚拟机的类加载机制: 虚拟机把描述类的数据从Class 文件中加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接…

python简易版实例_Python3之简单搭建自带服务器的实例讲解
WEB开发,我们先从搭建一个简单的服务器开始,Python自带服务模块,且python3相比于python2有很大不同, 在Python2.6版本里,/usr/bin/lib/python2.6/ 目录下会有 BaseHTTPServer.py, SimpleHTTPServer.py, CGIHTTPServer.…

如何选择分布式系统(区块链)协议?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 如何选择分布式系统(区块链)协议? 在构建包分布式系统功能的应用程序时,《财富》500强企业和创始人经常问我们…

MySQL与IO
数据库作为存储系统,所有业务访问数据的操作都会转化为底层数据库系统的IO行为(缓存系统也可以当做是key-value的数据库),本文主要介绍访问mysql数据库的IO流程以及IO相关的参数。 一 MySQL 的文件 首先简单介绍一下MySQL的数据文件,MySQL 数据库包含如下…

python括号配对问题_使用Python的栈实现括号匹配算法
写一个栈的类:stack.py class Stack: def __init__(self): self.items [] def is_Empty(self): return self.items [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[len(items)-1] …

万航单位换算器 V1.0 绿色版
软件名称: 万航单位换算器软件语言: 简体中文授权方式: 免费软件运行环境: Win 32位/64位软件大小: 347KB图片预览: 软件简介:万航单位换算器是一个可以随意转换单位的绿色软件,这个软件收集了各…

Golang学习-基础命令
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 、 Golang学习-基础命令 一、go run 用于运行命令源码文件,只能接收一个命令源码文件以及若干个库源码文件作为参数。先将源码文件编译…

js MD5加密处理
关于MD5: MD5.js是通过前台js加密的方式对用户信息,密码等私密信息进行加密处理的工具,也可称为插件。 在本案例中 可以看到MD5共有6种加密方法: 1, hex_md5(value) 2, b64_md5(value) 3, st…

手机qq2008触屏版_比微信老却是00后最爱 手机QQ 16年进化史
5月5日,腾讯QQ发布了《00后数据报告》,第一次以长图形式向公众展示了00后对于QQ的喜爱。当然物是人非,当年那个“胖企鹅”已经和现在功能强大、颜值超高的QQ不可同日而语。那些留存在我们记忆中,给我们带来无尽欢乐的聊天工具&…

密码学是如何保护区块链的
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 密码学是如何保护区块链的 摘要:密码学是应用数学函数以保证数据安全性的科学。 许多风靡的影视作品都在向人们暗示:只要有…

洛谷.4234.最小差值生成树(LCT)
题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差。 每次构成树时更新答案。答案就是当前边减去生成树上最小边的权值。 LCT…

python数字计算公式_Python中数字以及算数运算符的相关使用
Python数字 数字数据类型用于存储数值。 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。 当你指定一个值时,Number对象就会被创建: var1 1 var2 10 您也可以使用del语句删除一些对象引用。 del语句的语法是&#…

软件测试安全测试高峰论坛
Nubia测试以及介绍 基于Cucumber的自动化测试平台 常见Web漏洞之XSS,主要HTML与JS基础、XSS的基础知识与挖掘方法、XSS的利用 自动化测试框架以及测试思路 转载于:https://www.cnblogs.com/ITniu/p/5776005.html

以太坊是什么,为什么这么火?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 以太坊是什么 以太坊(Ethereum)是一个建立在区块链技术之上, 去中心化应用平台。它允许任何人在平台中建立和使…

Python 把字符串变成浮点数
from functools import reducedi {}di.update(zip(1234567890., [1,2,3,4,5,6,7,8,9,0,.])) def str2float(s): st s.split(.) st1 reduce(lambda x,y: 10*x y, map(lambda x: di[x], st[0])) try: st2 reduce(lambda x,y: (x*0.1 y), map(lambda x:…

msbuild FileSysExcludeFiles
<?xml version"1.0" encoding"utf-8"?> <!-- This file is used by the publish/package process of your Web project. You can customize the behavior of this process by editing this MSBuild file. In order to learn more about this pl…

python二分法求解_Python使用二分法求平方根的简单示例
这篇文章主要为大家详细介绍了Python使用二分法求平方根的简单示例,具有一定的参考价值,可以用来参考一下。 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 使用二分法(Bisection Met…