>  기사  >  백엔드 개발  >  FastAPI에서 장애 조치 및 요청 재시도를 구현하는 방법

FastAPI에서 장애 조치 및 요청 재시도를 구현하는 방법

WBOY
WBOY원래의
2023-07-28 13:33:341456검색

FastAPI에서 요청 실패 복구 및 재시도를 구현하는 방법

소개:
웹 애플리케이션을 개발할 때 다른 서비스와 통신해야 하는 경우가 많습니다. 그러나 이러한 서비스에는 일시적인 네트워크 중단이나 응답 시간 초과 등의 오류가 발생할 수 있습니다. 애플리케이션의 안정성을 유지하려면 장애를 복구하고 필요할 때 다시 시도해야 합니다. 이 기사에서는 FastAPI에서 장애 조치 및 요청 재시도를 구현하는 방법을 알아봅니다.

FastAPI는 Python 기반의 최신 웹 프레임워크로 간단하고 효율적인 요청 처리 및 라우팅 기능을 제공합니다. 내부적으로 비동기 방식을 사용하여 요청을 처리하므로 장애 복구 및 재시도 구현이 더 쉽습니다.

오류 복구 및 재시도 구현 아이디어:
오류 복구 및 재시도 기능을 구현하기 전에 먼저 몇 가지 기본 개념을 이해해야 합니다.

  1. 회로 차단기 모드:
    회로 차단기는 결함 확산을 방지할 수 있는 설계 모드입니다. 서비스가 실패하면 회로 차단기는 특정 기간 동안 서비스에 대한 요청을 일시적으로 닫고 요청을 직접 반환합니다. 이렇게 하면 실패한 서비스에 대한 추가 로드를 방지하고 서비스를 복구할 시간을 확보할 수 있습니다. 일정 시간 동안 장애가 발생하지 않으면 회로 차단기가 자동으로 복구하여 서비스에 다시 요청을 전달합니다.
  2. 재시도 메커니즘:
    재시도 메커니즘은 요청이 실패할 때 동일한 요청을 다시 보내는 것이며 일반적으로 약간의 지연 시간을 추가합니다. 재시도 메커니즘은 요청의 신뢰성을 보장하고 장애 복구 후 요청을 다시 보낼 수 있습니다.

위의 아이디어를 바탕으로 회로 차단기 모드 및 재시도 메커니즘을 사용하여 요청 실패 복구 및 재시도를 달성할 수 있습니다.

구현 단계:
다음 코드 예제는 FastAPI에서 장애 조치 및 요청 재시도를 구현하는 방법을 보여줍니다.

from fastapi import FastAPI
import requests

app = FastAPI()

@app.get("/retry")
def retry():
    url = "http://example.com/api"  # 要请求的URL
    max_retries = 3  # 最大重试次数
    retry_interval = 1  # 重试间隔时间(秒)

    retries = 0
    while retries <= max_retries:
        try:
            response = requests.get(url)
            return response.json()
        except requests.exceptions.RequestException as error:
            print(f"Request failed: {error}")
            retries += 1
            time.sleep(retry_interval)

    return {"message": "Max retries exceeded"}

@app.get("/circuit-breaker")
def circuit_breaker():
    url = "http://example.com/api"  # 要请求的URL
    breaker = Breaker(url, max_failures=3, reset_timeout=10)

    try:
        response = breaker.execute(requests.get)
        return response.json()
    except BreakerOpenError:
        return {"message": "Service temporarily unavailable"}

class Breaker:
    def __init__(self, url, max_failures, reset_timeout):
        self.url = url
        self.max_failures = max_failures
        self.reset_timeout = reset_timeout
        self.failures = 0
        self.last_failure = None

    def execute(self, func):
        if self.failures >= self.max_failures:
            if self.last_failure and time.time() - self.last_failure < self.reset_timeout:
                raise BreakerOpenError()
            else:
                self.reset()

        try:
            response = func(self.url)
            self.failures = 0
            return response
        except requests.exceptions.RequestException as error:
            print(f"Request failed: {error}")
            self.failures += 1
            self.last_failure = time.time()

    def reset(self):
        self.failures = 0
        self.last_failure = None

class BreakerOpenError(Exception):
    pass

위 코드에서는 retrycircuit_breaker两个路由示例来实现请求的故障恢复和重试。retry路由示例使用一个while循环来进行重试,当请求失败时,会等待一段时间后重新发送请求。circuit_breaker라우팅 예제를 사용하여 사용자 정의 회로 차단기 클래스를 사용합니다. 오류에 도달하면 사용자 정의 BreakerOpenError 예외가 발생합니다.

결론:
이 기사에서는 FastAPI에서 장애 조치 및 요청 재시도를 구현하는 방법을 배웠습니다. 회로 차단기 패턴과 재시도 메커니즘을 사용하여 애플리케이션의 안정성을 향상하고 오류를 복구할 수 있습니다. 동시에 샘플 코드를 통해 FastAPI에서 장애 복구 및 재시도 기능을 구현하는 방법도 시연했습니다. 이 글이 도움이 되셨으면 좋겠습니다. 읽어주셔서 감사합니다!

위 내용은 FastAPI에서 장애 조치 및 요청 재시도를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.