什么是程序设计里的 backoff pattern

简介: 什么是程序设计里的 backoff pattern

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 秒。


相关文章
|
7天前
必知的技术知识:DoubleDispatchAndVisitorPattern
必知的技术知识:DoubleDispatchAndVisitorPattern
|
2月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
2月前
|
设计模式 自然语言处理 编译器
二十三种设计模式全面解析-解释器模式(Interpreter Pattern):用代码诠释语言的魅力
二十三种设计模式全面解析-解释器模式(Interpreter Pattern):用代码诠释语言的魅力
|
8月前
|
设计模式 自然语言处理 机器人
认真学习设计模式之解释器模式(Interpreter Pattern)
认真学习设计模式之解释器模式(Interpreter Pattern)
62 0
|
设计模式 JavaScript
什么是程序设计里的 backoff pattern
什么是程序设计里的 backoff pattern
行为型模式 - 解释器模式(Interpreter Pattern)
行为型模式 - 解释器模式(Interpreter Pattern)
|
设计模式 SQL
【愚公系列】2021年12月 二十三种设计模式(十五)-解释器模式(Interpreter Pattern)
【愚公系列】2021年12月 二十三种设计模式(十五)-解释器模式(Interpreter Pattern)
121 0
【愚公系列】2021年12月 二十三种设计模式(十五)-解释器模式(Interpreter Pattern)
|
设计模式 安全 Java
设计模式|从Visitor Pattern说到Pattern Matching
在软件开发领域,我们每次遇到的问题可能都各不相同,有些是跟电商业务相关的,有些是跟底层数据结构相关的,而有些则可能重点在性能优化上。然而不管怎么样,我们在代码层面上解决问题的方法都有一定的共性。有没有人总结过这些共性呢?
设计模式|从Visitor Pattern说到Pattern Matching
|
移动开发 PHP 设计模式

热门文章

最新文章