- 工程实践 - 《QPS百万级的有状态服务实践》04 - 服务一致性

​​​​​        本文属于专栏《构建工业级QPS百万级服务》


        继续上篇《QPS百万级的有状态服务实践》03 - 消息队列。目前我们的系统如图1,已经可以完成数据生产和更新。但是目前我们的业务是分布式集群,每台机器收到的的消息时间不一样,那每个机器的数据版本在更新数据期间,就可能不一样。那在服务数据升级时,请求被分到不同机器上,那就会导致请求计算使用的数据版本来不一致,可能会影响用户体验。

图1

        那如何保证用户请求返回的一致性呢。首先,没有观察者和被观察者就没有一致性这个说法,因为从客观的角度来看,消息一定不会同一时间到达,所以一定会有一段时间,服务的数据版本不一致。除了我们的系统,任何分布式系统都一样,客观角度,在服务变更的时候,没有可能做到机器之间完全一致。这是由客观物理规律决定的,简单的说,光速是固定的,而到达机器的路径长度是不一致的。当然,量子计算机不在本文的讨论范围内。

        客观的不一致是不可避免的,但是从观察者的角度来看,不同请求的一致性,还有优化的空间的。最理想的情况就是,在用户的眼中,服务集群的行为和单机一摸一样。那么我们第一个解法就自然出现了,让同一个用户的请求,始终发往同一台机器,目前大部分负载均衡的服务器都支持该功能,不过这不能完全保证一致性,因为机器可能重启或者被置换。另外这种方法,不适合用户量不大,且用户之间请求十分不均匀的情况下,可能导致数据倾斜。

        在同一个用户的请求必须分布到不同机器的时候,那服务返回的数据不一致将不可避免。但是客户端如果也在我们的控制范围内,事情似乎也变得简单,我们在客户端记录上次获取的结果使用的数据版本,如果此次请求返回的版本比上次还小,就重试,直到得到获取到的结果使用的数据版本大于等于上次,这个方法并不是没有代价,我是用了部分请求的延迟,换了一致性。正如这个方案表现的这样,系统设计中没有银弹,只有取舍。但是上面这个办法还不够完美,因为客户端重启甚至重装的时候,上次请求的版本就丢失了,而上一次请求已经用了新版本的数据,虽然这种情况,一般不会对版本顺序一致性有高要求,但是如果有,则客户端记录就变得困难。虽然我们可以积累一小段时间的请求,如果版本都一致我们才使用,但如果用户足够多,部分请求还是可能恰好全在老版本机器上,导致重启后,请求到的结果版本反而是老的。所以客户端记录虽然能解决大部分问题,但是小部分极端情况,我们还得在服务端解决一致性问题。

        服务端要保证每个用户得到的请求结果是一致的,那就是需要机器之间通信,保证任意一个机器除了用户请求时,知道上次该用户请求到的数据版本。这意味着,用户上次请求的信息,在某个地方持久化了,并且一个用户的多个请求,在不同机器不能同时执行,必须一个机器执行完了,才能执行下一个,这大大降低了请求处理的吞吐量。强一致性(线性一致性和顺序一致性)的代价就是降低了系统吞吐量

        如果系统可以容忍,短时间的版本回退,也就是对客户端来说,服务端是最终一致性,那就大大增加了系统吞吐量。当然最终一致性也会因为“最终”是指需要10秒,还是1小时,而影响系统的复杂度。

        这里没有完美的方案,需要根据实际业务做取舍,对于我们的日期间隔计算系统,我的选择是系统为最终一致性,具体做法是在服务侧让用户请求尽量到一台机器,用户如果期望降低不一致的情况,自行在客户端存储版本来过滤。核心原因是,我主观地认为这个场景,保证强一致性增加的收益,远小于增加的服务器资源。但是这个观点不是永恒的,它会随着客户需求,以及资源成本的变化而变化。

        通过本章,我们的架构更清晰了,我们明确了架构在一致性问题上的能力边界。虽然架构可以提供节假日查询了,但是用户如果才能查询过去的请求记录呢,我会之后的章节中分享我的经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/398700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[经验] 玄殿社区qq堂4.2 #笔记#媒体

玄殿社区qq堂4.2 1、玄殿 玄殿,位于中国北京市的紫禁城内,是明清两代帝王祭天的场所。玄殿前殿为皇帝向神明祭拜的地方,中殿为祭天的主要场所,后殿为宋代遗址。玄殿规模庞大,身为中国传统建筑的代表之一,…

《Linux运维总结:Ubuntu22.04忘记root密码解决方案》

一、解决方法 1、首先重新启动Ubuntu系统,然后快速按下shift键,以调出grub启动菜单,如下图所示: 2、在这里我们选择第二个(Advance options for Ubuntu),选中后按下Enter键,如下图所…

【经验分享】自然语言处理技术有哪些局限性和挑战?

个人认为,主要是两个难点: 1.语料,通常的语料很好解决,用爬虫从互联网上就可以采集和标注训练。但是我们接触很多项目和客户需求都是专业性很强的,例如:航天材料、电气设备、地理信息、化学试剂 等等。往往…

虹科方案 | 释放总线潜力:汽车总线离线模拟解决方案

来源:虹科汽车智能互联 虹科方案 | 释放总线潜力:汽车总线离线模拟解决方案 原文链接:https://mp.weixin.qq.com/s/KGv2ZOuQMLIXlOiivvY6aQ 欢迎关注虹科,为您提供最新资讯! #汽车总线 #ECU #汽车网关 导读 传统的…

docker安装一系列镜像

启动docker systemctl start docker docker 启动已经停止的容器 docker start idOrName PS:idOrName为容器的id或者名称 1、安装mysql镜像 拉取mysql5.7的镜像 docker pull mysql:5.7 查看镜像 docker images 启动mysql #启动mysql docker run --name mysql…

【 Maven 】花式玩法之多模块项目

目录 一、认识Maven多模块项目 二、maven如何定义项目的发布策略 2.1 版本管理 2.2 构建配置 2.3 部署和发布 2.4 依赖管理 2.5 发布流程 三、使用Jenkins持续集成Maven项目 四、总结 如果你有一个多模块项目,并且想将这些模块发布到不同的仓库或目标位置&…

中科大计网学习记录笔记(十四):多路复用与解复用 | 无连接传输:UDP

前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…

gitlab 项目上线,项目上线后回滚

gitlab 项目上线,项目上线后回滚 1.需要自己有个gitlab项目环境,没有找我,docker-compose 一键环境启动 2.发起合并请求3.选择合并的分支4.点击创建合并,然后确认合并合并完成,进行回滚操作,在合并详情页…

【小样本命名实体识别】COPNER论文源码详解

COPNER: Contrastive Learning with Prompt Guiding for Few-shot Named Entity Recognition 原文与代码链接: https://github.com/AndrewHYC/COPNER 一、项目结构 二、代码分析 1.定义参数 配置训练环境 parser.add_argument(--gpu, default0,helpthe gpu num…

Java基于SSM的羽毛球馆管理系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

halide package cmake的设置方式

1 先找一个例程。里面用到halide。 这时会提示找不到package。 按照那个提示做就行。 2 把提前下载好的halide放到一个位置 3 然后设置一下那个Halide_DIR就可以了 set(Halide_DIR "${CMAKE_SOURCE_DIR}/your_path/Halide/") list(APPEND CMAKE_PREFIX_PATH ${Ha…

认识ansible,了解常用的模块

ansible的概念 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主…

Tuxera NTFS2024最新中文版支持M1/M2/M3苹果全系机型

Tuxera NTFS的传输速度会受到多种因素的影响,包括硬件配置、文件大小、存储设备的性能等。因此,无法给出具体的传输速度数值。 不过,根据一些用户的使用经验和测试数据,Tuxera NTFS的传输速度通常都非常快,能够满足大…

深度解析Sora的核心技术

Sora要解决的核心问题 Sora面临的挑战是将不同类型的视觉信息,如视频、文本、图像和声音等,整合为一种共同的表征形式。这种转换是实现统一训练过程的关键,旨在将各类数据集中到一个训练框架中,以便于进行大规模的统一学习。简而…

计算机视觉的应用24-ResNet网络与DenseNet网络的对比学习,我们该如何选择。

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用24-ResNet网络与DenseNet网络的对比学习,我们该如何选择。在计算机视觉领域,ResNet(残差网络)和DenseNet(密集网络)都是深度学…

白银交易新手指南:怎样选择可靠的现货交易平台?

在投资市场上,白银作为一种贵金属,具有较高的投资价值和风险防范功能。对于白银交易新手来说,选择一个可靠的现货交易平台是至关重要的。那么,如何挑选一个适合自己的现货交易平台呢? 1. 平台资质 一个正规的现货交易…

【洛谷题解】B2034 计算 2 的幂

题目链接&#xff1a;计算 2 的幂 - 洛谷 题目难度&#xff1a;入门 涉及知识点&#xff1a;pow函数返回值 题意&#xff1a; 分析&#xff1a;用pow计算再强制转换即可 AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int main(){int a;ios::syn…

在线图片生成工具:定制化占位图片的利器

title: 在线图片生成工具&#xff1a;定制化占位图片的利器 date: 2024/2/20 14:08:16 updated: 2024/2/20 14:08:16 tags: 占位图片网页布局样式展示性能测试响应式设计在线生成开发工具 在现代的网页设计和开发中&#xff0c;占位图片扮演着重要的角色。占位图片是指在开发过…

数据结构---字典树(Tire)

字典树是一种能够快速插入和查询字符串的多叉树结构&#xff0c;节点的编号各不相同&#xff0c;根节点编号为0 Trie树&#xff0c;即字典树&#xff0c;又称单词查找树或键树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。 核心思想也是通过空间来换取时间上的…

AFNetWorking源码

套话 AFNetworking是iOS最常用的网络框架&#xff0c;虽然系统也有NSURLSession&#xff0c;但是我们一般不会直接用它。AFNetworking经过了三个大版本&#xff0c;现在用的大多数都是3.x的版本。 AFNetworking经历了下面三个阶段的发展&#xff1a; 1.0版本 : 基于NSURLConn…