指数退避和抖动

目录

引入 OCC

添加退避机制

添加抖动机制

小结


  • 引入 OCC

  • 乐观并发控制(Optimistic Concurrency Control,OCC)是一种既能保证多个写入者安全地修改单个对象又能避免丢失写入的古老方法
  • OCC具有三个优点:只要底层存储可用,它总能取得进展;易于理解,易于实现
  • DynamoDB 的条件写入使OCC成为DynamoDB 用户的自然选择,并且DynamoDBMapper 客户端原生支持OCC
  • 尽管OCC可以保证有进展,但在高争用情况下它的表现仍然很差
  • 所谓高争用(是指在多个线程或进程同时访问或修改共享资源时的情况,这可能导致竞争条件和性能问题;它与"高并发"有一定的关联,但并不完全相同("高并发"强调的是系统同时处理多个并发请求的能力,通常表示系统在单位时间内可以处理的并发请求数量非常大;而"高争用"则强调的是在共享资源上的竞争程度,即多个并发操作对同一个资源的竞争情况)(因此,"高争用"更专注于资源竞争的概念,而"高并发"更关注系统整体的并发处理能力;当存在高争用情况时,可能会出现性能瓶颈和竞争条件,需要采取合适的并发控制和优化策略来解决这些问题))
  • 这些争用情况中最简单的是当大量客户端同时启动并尝试更新同一数据库行时
  • 由于每轮保证有一个客户端成功,因此完成所有更新所需的时间与争用程度呈线性增长
  • 在本文的图表中,使用了一个小型模拟器来模拟 OCC 在带有延迟(以及延迟方差)的网络中对远程数据库的行为
  • 在这个模拟中,网络引入了平均 10ms 的延迟和 4ms 的方差
  • 第一个模拟展示了随着争用程度增加,完成时间如何呈线性增长
  • 这种线性增长是因为每轮只有一个客户端成功,所以需要N轮才能让所有N个客户端都成功

  • 不幸的是,这还不是全部
  • 当有N个客户端竞争时,系统所完成的总工作量将以N的平方增加

  • 添加退避机制

  • 这里的问题是有 N 个客户端在第一轮中竞争,N-1 个客户端在第二轮中竞争,依次类推
  • 让每个客户端在每一轮中都竞争是浪费的
  • 减缓客户端的速度可能有所帮助,而经典的减缓客户端的速度的方法是采用有上限的指数退避(限制指数退避)
  • 有上限的指数退避意味着客户端在每次尝试后都会将退避时间乘以一个常数,直到达到某个最大值
  • 在我们的例子中,每次尝试失败后,客户端会睡眠一段时间:

  • 重新运行模拟显示,退避机制在一定程度上有所帮助,但并不能解决问题;客户端的工作量仅有轻微减少

  • 查看问题的最佳方法是查看指数退避调用发生的时间

  • 很明显,指数退避起到了作用,因为调用发生的频率越来越低
  • 然而,问题也显而易见:仍然存在调用的集群
  • 我们并没有减少每轮竞争的客户端数量,只是引入了一些没有任何客户端竞争的时间段
  • 尽管网络延迟的自然变化导致了一些分散,但竞争并没有得到很大程度的减少
  • 添加抖动机制

  • 解决方案并不是移除退避机制,而是添加抖动机制
  • 最初,抖动似乎是一个违反直觉的想法:试图通过添加随机性来提高系统的性能
  • 然而,上述时间序列提供了使用抖动的充分理由——我们希望将峰值分散到相对恒定的速率
  • 添加抖动只需要对睡眠函数进行微小修改即可

  • 那个时间序列看起来好很多
  • 间隔不再存在,除了最初的峰值外,呼叫的速率大致保持恒定
  • 这对于总呼叫次数也产生了很好的效果

  • 在有100个竞争客户端的情况下,我们将呼叫次数减少了一半以上
  • 与不使用抖动的指数退避相比,我们还大幅改善了完成时间

  • 有几种方法可以实现这些定时退避循环
  • 我们将上述算法称为“完全抖动”,并考虑两种替代方案
  • 第一种替代方案是“相等抖动”,它总是将一些退避和抖动保持较小的量:

  • 这种方法的原理是,它防止了非常短的延迟,始终保留一部分退避的减速效果
  • 第二种替代方案是“去关联抖动”,与“完全抖动”类似,但是我们还会根据上一个随机值来增加最大抖动范围

  • 小结

  • 在计算机网络中,指数退避和抖动是一种常见的错误恢复和重试策略
  • 当发生网络传输错误或拥塞时,指数退避和抖动策略可以帮助减少冲突和重试的负载,提高系统的稳定性和效率
  • 指数退避是指在发生错误后(竞争失败后),等待一段时间然后重试的操作,并且在每次重试时增加等待时间的策略
  • 具体来说,等待时间是根据指数函数逐渐增加的,通常是当前重试次数的指数幂
  • 这样做可以在网络拥塞的情况下,给予网络更多时间来恢复,并避免短时间内的连续冲突
  • 抖动是指在等待时间的基础上引入一个随机因素,使得重试的时间间隔稍微有所变化
  • 这样做的目的是避免在网络中出现周期性的重试,避免网络拥塞或错误引起的冲突
  • 通过结合指数退避和抖动策略,可以在网络中更有效地处理错误和重试操作,提高系统的可靠性和性能
  • 哪种方法最好?
  • 从客户端工作量的角度来看,无论是“完全抖动”还是“相等抖动”,调用次数都大致相同,而“去关联抖动”的调用次数更高
  • 相对于无抖动方法,这两种方法都大大减少了工作量

  • 没有抖动的指数退避方法显然是失败者
  • 它不仅需要更多的工作量,而且比带有抖动的方法需要更长的时间
  • 实际上,它需要更多的时间,我们不得不将其从图表中删除,以便更好地比较其他方法

  • 在带有抖动的方法中,“相等抖动”是失败者
  • 它的工作量略高于“完全抖动”,而且耗时更长
  • 而在“去关联抖动”和“完全抖动”之间的选择则不那么明确
  • “完全抖动”方法的工作量更少,但需要稍微更长的时间
  • 但两种方法都大大减少了客户端工作量和服务器负载
  • 值得注意的是,这些方法都没有从根本上改变要完成的工作的N2特性,但在适度的竞争水平下,它们显著减少了工作量
  • 使用抖动的指数退避的实施复杂度回报是巨大的,因此应该被视为远程客户端的标准方法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指针、数组与函数例题

1、简单数字显示 题目描述 本例要求实现对变量的直接访问和间接访问。输入任意两个整数,先用直接访问的方式输出这两个变量的值,再通过指针变量用间接访问的方式输出这两个变量的值。 输入要求 输入两个整数 输出要求 先用直接访问方式使出这两个整…

leetCode 131.分割回文串 + 回溯算法 + 图解 + 笔记

131. 分割回文串 - 力扣(LeetCode) 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串 示例 1: 输入:s "aa…

从原理和公式出发:python实现One_Way_ANOVA

文章目录 目的:python实现one way ANOVA 单因素方差分析1. 代码流程2. python代码实现0 主要的函数1 加载数据2 查看数据统计结果3 数据处理及可视化4 方差分析4.1 模型拟合4.2 单因素方差分析 5 Post Hoc t-test组间比较分析6 根据定义自行分解计算对比调用函数的结…

pandas-profiling / ydata-profiling介绍与使用教程

文章目录 pandas-profilingydata-profilingydata-profiling实际应用iris鸢尾花数据集分析 pandas-profiling pandas_profiling 官网(https://pypi.org/project/pandas-profiling/)大概在23年4月前发出如下公告: Deprecated pandas-profilin…

积分表二(高等数学同济版中所有的积分公式)

文章目录 含有 x − a x a \sqrt{\pm \frac{x-a}{xa}} xax−a​ ​ 或者 ( x − a ) ( b − x ) \sqrt{(x-a)(b-x)} (x−a)(b−x) ​ 的积分含有三角函数函数的积分含有反三角函数的积分 (其中 a > 0 a>0 a>0)含有指数函数的积分含有对数函数的积分含有双曲函数的…

Object常用方法

toString():返回对象的字符串表示形式。hasOwnProperty(propertyName):检查对象是否有指定的属性。isPrototypeOf(object):检查一个对象是否是另一个对象的原型。propertyIsEnumerable(propertyName):检查对象的指定属性是否可以枚…

LeetCode 4 寻找两个正序数组的中位数

题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 [1,3], nums2 [2] 输出:2.0…

MediaPipe - 小记

文章目录 关于 MediaPipe 关于 MediaPipe Cross-platform, customizable ML solutions for live and streaming media. MediaPipe : 设备端机器学习框架 MediaPipe Studio : 提供标准化 task,你可以下载预训练模型来使用 MediaPipe Model Maker : 定制…

python中的字符串

字符串 字符串是编程语言中的一种基本数据类型,用于表示一串字符序列。在Python中,字符串是不可变的,也就是说一旦字符串被创建,就无法修改其中的字符。 Python中的字符串可以用单引号或双引号括起来,例如&#xff1…

构建SQL Server链接服务器:实现跨服务器数据访问及整合

点击上方蓝字关注我 在SQL Server数据库管理中,链接服务器是一项强大的功能,允许在一个SQL Server实例中访问另一个SQL Server实例的数据。这种功能为数据库管理员提供了灵活性,使其能够跨不同服务器进行数据交互,开辟了更多的应用…

RLHF:强化学习结合大预言模型的训练方式

RLHF (Reinforcement Learning from Human Feedback) 以强化学习方式依据人类反馈优化语言模型。 文章目录 一、简介二、一般的流程三、微调gpt介绍示例 参考文章 一、简介 强化学习从人类反馈中学习(RLHF,Reinforcement Learning from Human Feedback&a…

【代码随想录】算法训练计划37

贪心 1、738. 单调递增的数字 题目&#xff1a; 输入: n 10 输出: 9 思路&#xff1a; func monotoneIncreasingDigits(n int) int {// 贪心&#xff0c;利用字符数组s : strconv.Itoa(n)ss : []byte(s)leng : len(ss)if leng < 1 {return n}for i:leng-1; i>0; i-- …

为什么不把所有的函数都定义成内联函数

内联是以代码膨胀为代价&#xff0c;仅仅省去了函数调用的开销&#xff0c;从而提高函数的执行效率。如果执行函数体内代码的时间相比于函数调用的开销较大&#xff0c;那么效率的收获会很少。另一方面&#xff0c;每一处内联函数的调用都要复制代码&#xff0c;将使程序的总代…

vscode集成git

1、首先电脑要安装git 打开git官网地址&#xff1a;Git进行下载&#xff0c;如下图界面&#xff1a; 如图片中描述&#xff1a;一般进入官网后会识别电脑对应系统&#xff08;识别出了我的电脑是Windows系统 。如果未识别到电脑系统&#xff0c;可在左侧选择自己电脑对应的系统…

主成分分析例题 (多元统计分析期末复习)

例一 给定X的协差阵&#xff0c;对其进行主成分分析, &#xff08;1&#xff09;求出每个主成分的贡献率&#xff1b; &#xff08;2&#xff09;求出每个原始变量的信息提取率&#xff1b; 解&#xff1a;对于主成分分析的题&#xff0c;一般来说&#xff0c;题目给定一个协方…

us提升到ns级精度settimeofday()到clock_settime()

精度 clock_settime()精度比settimeofday()高&#xff0c;受限制于参数的结构体&#xff0c;一个是ns级精度&#xff0c;另一个us级精度。具体两个函数原因参考如下。 int clock_settime(clockid_t clk_id, const struct timespec *tp); int settimeofday(const struct timeva…

[vue3] 使用 vite 创建vue3项目的详细流程

一、vite介绍 Vite&#xff08;法语意为 “快速的”&#xff0c;发音 /vit/&#xff0c;发音同 “veet”) 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验&#xff08;热更新、打包构建速度更快&#xff09;。 二、使用vite构建项目 【学习指南】学习新技能最…

Elasticsearch:使用 ILM 示例运行降采样 (downsampling)

如果你对降采样还不是很熟的话&#xff0c;请阅读之前的文章 “Elasticsearch&#xff1a;对时间序列数据流进行降采样&#xff08;downsampling)”。这是一个简化的示例&#xff0c;可让你快速了解降采样如何作为 ILM 策略的一部分来减少一组采样指标的存储大小。 该示例使用典…

2021年3月9日 Go生态洞察:Go开发者调研结果解读

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

java对象 转换成json字符串 工具类 jackson

jackson概述 Jackson 是一个用于处理 JSON 数据的 Java 库&#xff0c;由 FasterXML 公司开发和维护。它提供了一组功能强大的 API&#xff0c;用于在 Java 对象和 JSON 数据之间进行高效的序列化&#xff08;将对象转换为 JSON 格式&#xff09;和反序列化&#xff08;将 JSO…