“凭什么说你比我先?”——没有上帝时钟,如何判断“谁先谁后”?

简介: 在分布式系统中,物理时钟难以同步,兰伯特逻辑时钟通过单调递增的时间戳刻画事件偏序关系,但无法识别并发。向量时钟扩展了这一思想,利用向量记录各节点事件次数,精确捕捉因果关系并判断并发。版本向量则将该机制应用于数据冲突检测,支持多副本系统的版本管理和冲突合并,常见于去中心化场景。

物理时钟在分布式系统中难以完美同步,导致无法仅凭物理时间戳来精确判断事件的因果顺序。逻辑时钟为此而生。

兰伯特逻辑时钟
兰伯特逻辑时钟(Lamport Logical Clock)为系统中的每个事件分配一个单调递增的数字(时间戳),用于捕捉事件间的偏序关系(Happened-Before Relationship)。
假设每个进程 Pi 维护一个本地计数器Ci 。
1)进程内事件发生:Pi 在执行一个内部事件或发送消息前,Ci = Ci +1。
2)消息发送:Pi 发送消息m时,附带当前Ci 值作为消息时间戳 ts(m)。
3)消息接收:Pj 接收到消息m后,更新其本地计数器 Cj = max(Cj, ts(m) )+ 1。
如果事件A发生在事件B之前(A -> B),则 C(A) < C(B)。但反之不成立,即 C(A) < C(B)并不一定意味着 A -> B,A和B可能是并发的。
兰伯特时钟虽然解决了存在依赖关系的事件时序,但无法区分两个具有相同逻辑时间戳的事件的真实顺序,也无法判断两个时间戳不同但无因果关系的事件是否为并发。

向量时钟
向量时钟(Vector clock)是逻辑时钟的一种扩展,能够更精确地捕捉事件间的因果关系,并能识别并发事件。
假设有事件A、B分别在节点p、q上发生,向量时钟分别为T[A]、T[B]。
如果Tq[B] > Tq[A]并且Tp[B] >= Tp[A],则A发生于 B之前,记作A -> B,此时说明事件A、B有因果关系。
如果Tq[B] > Tq[A]并且Tp[B] < Tp[A],则认为A、B同时发生,记作A <-> B,此时说明事件A、B不存在因果关系。
例如下图节点B上的第4个事件(A=2 B =4 C=1)与节点C上的第2个事件 (B=3 C=2)没有因果关系,在逻辑上判定为同时发生事件。
而C节点第1个事件(C=1)与B节点第1个事件(B=1 C=1)有因果关系,所以C节点第1个事件 (C=1) 先于B节点第1个事件 (B=1 C=1)发生,后者依赖前者,有先后关系。
image.png

版本向量
向量时钟最常见的应用是发现数据冲突(Detect conflict)。分布式系统中数据一般存在多个副本,多个副本可能被同时更新,这会引起副本间数据不一致,版本向量(Version vector)的实现与向量时钟非常类似,目的用于发现数据冲突。
版本向量用一个[counter nodes]对表示。其中,nodes表示节点,counter是一个计数器,初始为0,每次更新操作加1。
假设在一个“去中心化”的分布式系统中,有副本数N=3,R=2,W=2,初始3个副本(A B C)上的数据为(1 1 1),版本向量都为空([ ] [ ] [ ])。
1)首先,某次更新操作由节点A主导,执行+1操作,节点A更新自己及节点C成功。此时三个节点上的副本数据为(2 1 2),版本向量为([(1, A)] [ ] [(1, A)]),A、C的版本向量表示数据版本号为1,更新由节点A主导。
2)接着,更新操作由节点B主导,执行+2 操作,节点B更新自己及节点C成功。此时三个节点上的副本数据分别为(2 3 3),版本向量为([(1, A)] [(1, B)] [(1, B)])。
3)接着,更新操作再由节点A主导,执行+3操作,节点A更新自己及节点C成功。此时三个节点上的数据为(5 3 5),版本向量为([(2, A) (1, A)] [(1, B)] [(2, A) (1, A)])。
4)最后,假设用户读取节点A及节点B上的数据,得到两个不一致的数据5与 3,及这两个数据的版本信息[(2, A) (1, A)] [(1, B)]。假设用户判断出,其实这些加法操作可以合并,那么最终的数据应该是7,另外用户也可以选择保留一个数据例如5作为自己的数据。
由于提供了版本向量信息,不一致的数据其实成为了多版本数据,用户可以通过自定义策略选择合并这些多版本数据。最常见的冲突解决方法有两种:一种是通过客户端逻辑来解决,比如购物车应用;另外一种常见的策略“Last write win”,即选择时间戳最新的副本。

image.png

未完待续

很高兴与你相遇!如果你喜欢本文内容,记得关注哦!!!

目录
相关文章
|
2月前
|
机器学习/深度学习 传感器 分布式计算
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
179 14
|
2月前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
461 51
|
2月前
|
数据采集 大数据 BI
终于有人把指标管理平台讲明白了!
企业常因数据口径不一、重复开发、效率低下等问题陷入“数据扯皮”。搭建指标管理平台可统一标准,提升数据质量与协作效率。通过FineBI等工具,实现数据连接、指标管理、分析应用三层架构,推动数据驱动决策,助力企业降本增效,真正实现数据资产化。
终于有人把指标管理平台讲明白了!
|
2月前
|
监控 前端开发 数据可视化
Github 12.3kstar, 3分钟起步做中后台?Go+Vue 脚手架,把权限、代码生成、RBAC 都封装好了
Go-admin 是基于 Gin + Vue 的中后台脚手架,集成 Casbin RBAC 权限、JWT 鉴权、GORM 数据库操作与 Swagger 文档,内置用户、角色、菜单等管理模块。提供代码生成器与表单构建器,支持多租户与多前端框架(Element UI/Arco/Ant Design),3 分钟快速搭建企业级后台,助力高效交付。
205 4
|
2月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
2月前
|
人工智能 数据可视化 数据处理
AI智能体框架怎么选?7个主流工具详细对比解析
大语言模型需借助AI智能体实现“理解”到“行动”的跨越。本文解析主流智能体框架,从RelevanceAI、smolagents到LangGraph,涵盖技术门槛、任务复杂度、社区生态等选型关键因素,助你根据项目需求选择最合适的开发工具,构建高效、可扩展的智能系统。
677 3
AI智能体框架怎么选?7个主流工具详细对比解析
|
2月前
|
XML 前端开发 决策智能
多智能体自主规划模式性能提升:五大精准策略详解
本文基于生产环境中的多智能体 React 模式实践,系统剖析了自主规划架构在工具调用延迟、上下文膨胀、中间态缺失、循环失控与监督缺位等方面的典型挑战。
460 19
|
2月前
|
XML Java Nacos
Spring Boot 整合Nacos 版本兼容适配 史上最详细文档
本文介绍SpringBoot整合Nacos的完整流程,涵盖Nacos下载安装、配置中心与服务发现集成、版本兼容性问题及实战配置。重点解决SpringBoot 3.3.0与Nacos版本适配难题,推荐使用Spring Cloud Alibaba方案,并提供项目开源地址供参考学习。