乐趣区

关于程序:什么是程序设计里的-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 秒。

退出移动版