首页 > 编程语言 >什么是程序设计里的 backoff pattern

什么是程序设计里的 backoff pattern

时间:2023-04-06 21:01:37浏览次数:49  
标签:pattern backoff 重试 等待时间 retryWhen 程序设计 response

Backoff pattern 是一种程序设计模式,通常用于处理因高负载或故障而导致的请求失败或错误。该模式基于一种简单的策略,即当请求失败时,等待一段时间后重试,等待时间逐渐增加,直到成功或达到最大重试次数为止。

在实际应用中,Backoff pattern 通常会包含以下几个要素:

初始等待时间:在第一次重试之前等待的时间,通常是一个较短的固定时间。

等待时间递增因子:每次重试时等待时间的增加因子,通常是一个固定的倍数或增量。

最大等待时间:达到该等待时间后不再进行重试,防止过度等待或死循环。

最大重试次数:达到该重试次数后停止重试,防止无限重试或死循环。

Backoff pattern 的优点是能够在高负载或故障情况下有效地处理请求失败,并减轻服务器负载。然而,该模式也存在一些缺点,例如可能会导致响应时间变慢,因为每次失败都需要等待一段时间后才会重试,并且需要在客户端上实现复杂的逻辑来处理重试。

一个简单的实现 Backoff pattern 的例子可以是以下的伪代码:

def make_request():
    retries = 0
    while retries < MAX_RETRIES:
        try:
            response = send_request()
            return response
        except Exception as e:
            if retries == MAX_RETRIES - 1:
                raise e
            retries += 1
            wait_time = INITIAL_WAIT_TIME * (BACKOFF_FACTOR ** retries)
            wait_time = min(wait_time, MAX_WAIT_TIME)
            time.sleep(wait_time)

Spartacus 里的 backoff 机制的一个例子:

下面是一个使用 Angular HttpClient 实现 backoff pattern 的 TypeScript 代码示例:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { retryWhen, delay, take, mergeMap } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class DataService {

  constructor(private http: HttpClient) { }

  getData(url: string): Observable<any> {
    return this.http.get(url).pipe(
      retryWhen(errors => errors.pipe(
        // 每秒重试一次,最多重试 3 次
        delay(1000),
        take(3),
        // 如果是 500 错误,则进行重试
        mergeMap(response => {
          if (response.status === 500) {
            return throwError(response);
          }
          return response;
        })
      ))
    );
  }
}

在这个示例中,我们定义了一个名为 DataService 的服务,该服务使用 Angular HttpClient 来获取数据。我们使用 retryWhen 操作符来实现 backoff pattern,它将在发生错误时重试 HTTP 请求。

在 retryWhen 中,我们使用 delay 操作符来指定每次重试之间的延迟时间,这里设置为 1000 毫秒。我们还使用 take 操作符来指定最大重试次数,这里设置为 3 次。

在 mergeMap 操作符中,我们检查响应的状态码是否为 500。如果是,我们使用 throwError 操作符将错误抛出,触发 retryWhen 中的重试逻辑。如果响应状态码不是 500,则直接返回响应。

因此,这个示例中的 backoff pattern 实现了在 HTTP 请求失败时进行重试,最多重试 3 次,每次重试之间延迟 1 秒。

标签:pattern,backoff,重试,等待时间,retryWhen,程序设计,response
From: https://www.cnblogs.com/sap-jerry/p/17294135.html

相关文章

  • 第二十届浙大城市学院程序设计竞赛 I.Magic Tree DFS序线段树
    传送门大致思路:  我们知道dfs序上的整颗子树dfs序编号连续,因为每次删除一个点或者新增一个点都导致子树上所有点的深度加一或者减一。由于是区间修改所以我们考虑dfs序上建线段树。  #include<iostream>#include<cstring>#include<iomanip>#include<algorithm>#in......
  • 2020 年百度之星·程序设计大赛 - 测试赛1001 度度熊保护村庄
    ProblemDescription哗啦啦村袭击了喵哈哈村!度度熊为了拯救喵哈哈村,带着自己的伙伴去救援喵哈哈村去了!度度熊与伙伴们很快的就过来占据了喵哈哈村的各个军事要地,牢牢的守住了喵哈哈村。但是度度熊发现,这是一场旷日持久的战斗,所以度度熊决定要以逸待劳,保存尽量多的体力,去迎战哗啦啦......
  • “杭银理财”杯浙江工业大学大学生程序设计竞赛暨全国邀请赛 签到题9题
    ProblemA.GrammyWantstoEarnBigMoney题意:今天是星期天,请计算之后的n天里,有多少天是星期一到星期五的开局太急直接/7*5+余数就交了,WA了一发,没有考虑余数=6的情况#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;cin>>n;n--;intans=(n/7)......
  • 牛客,第二十届北京师范大学程序设计竞赛,签到题7题
    序题号标题已通过代码通过率团队的状态A小凯的疑惑点击查看434/745通过B幻象踩花点击查看121/434通过C跳刀抓人点击查看26/178通过D真正的卡尔点击查看115/714通过E刷新的艺术点击查看31/479通过F最后的战役点击查看1/39未通过G随机数生成器点击......
  • Domino (贪心,多个位置排序,优先队列) 第二十届浙大城市学院程序设计竞赛
    题目大意:给出2个队列A,B选K个ai和在从里面选L个bi问权值最大时多少   思路:排序预处理有多个元素的时候,对那个元素首先排序,以至于可以处理这个问题是很重要的当不能一步直接贪心出来,可以先贪部分,然后利用DP的思想慢慢加入点去更新即可先对ai排序,......
  • Maze 第二十届浙大城市学院程序设计竞赛 (二分图,网络流(对于表格,矩阵是如何建边的))
    题目大意:给出一个01矩阵,给出q,p分别表示选一个点的权值,和选2个连在一起的点的权值问如何让权值更大 注意:在Dinic的时间复杂度对于二分图这种边权为1,时间复杂度为NsqrtN, 不是n^2m  思路:更具题目的条件限制,他的建边一定是2个矮在一起的因此更具(i......
  • “卓见杯”郑州轻工业大学第十五届程序设计大赛暨河南省高校邀请赛
    先写实验报告,回来再补文字题解  1计算括号对#include<bits/stdc++.h>usingnamespacestd;#definerep(i,a,b)for(inti=(a);i<=(b);i++)#defineper(i,a,b)for(inti=(a);i>=(b);i--)typedefdoubledb;typedeflonglongll;structcp{dbx,y;cp(db......
  • C 语言程序设计复习
    第一章程序设计和C语言计算机程序一组计算机能够识别和执行的指令计算机语言机器语言计算机只能识别由0和1组成的指令能够别计算机识别和接受的二进制代码成为机器指令机器指令的集合就是机器语言符号语言(汇编语言)计算机不能直接识别和执行,需要汇编程序将其转换为机......
  • 操作系统实验1 体验 Nachos 下的并发程序设计
    操作系统实验报告实验:Lab1TheTroublewithConcurrentProgramming专业:计算机科学与技术班级:1班姓名:姚怀聿学号:229202022046322023年3月24日目录一、实验目的3二、实验要求3三、实验设计及关键代码实现31.多线程执......
  • 2018年第九届蓝桥杯—B组C/C++程序设计省赛解题-2明码
    .明码汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛。16点阵的字库把每个汉字看成是16x16个像素信息。并把这些信息记录在字节中。一个字节可以存储8位信息,用32个字节就可以存一个汉字的字形了。把每个字节转为2进制表示,1表示墨迹,0表示底色。每行2个字节,一共16......