Sobes.tech
Middle+

Como implementar o padrão Waiter para a API?

sobes.tech IA

Resposta da IA

O padrão Waiter para API é implementado enviando periodicamente solicitações ao serviço até que uma condição específica seja atendida ou o tempo limite seja atingido.

Componentes principais:

  1. Requisição alvo (Target Request): A requisição que é feita e cujo resultado é verificado.
  2. Condição de término (Completion Condition): Expressão lógica que determina quando a espera deve terminar. Pode ser um estado de resposta específico (por exemplo, 200 OK), um valor no corpo da resposta, a presença ou ausência de um recurso, etc.
  3. Intervalo de sondagem (Polling Interval): Tempo entre requisições consecutivas.
  4. Tempo limite (Timeout): Tempo máximo durante o qual o Waiter fará requisições antes de terminar com um erro.

Exemplo de implementação em Python usando a biblioteca requests:

import time
import requests

def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
    """
    Implementação do padrão Waiter para API.

    Args:
        url (str): URL do recurso a esperar.
        expected_status (int): Estado HTTP esperado.
        interval (int): Intervalo de espera entre requisições em segundos.
        timeout (int): Tempo máximo de espera em segundos.

    Raises:
        TimeoutError: Se o tempo limite for atingido antes de alcançar o estado esperado.
        Exception: Se ocorrer um erro ao fazer a requisição.
    """
    start_time = time.time()

    while time.time() - start_time < timeout:
        try:
            response = requests.get(url)
            if response.status_code == expected_status:
                print(f"O recurso em {url} está disponível com o status esperado {expected_status}.")
                return response
            else:
                print(f"O recurso em {url} não está disponível. Status atual: {response.status_code}. Aguardando...")
        except requests.exceptions.RequestException as e:
            print(f"Erro na requisição para {url}: {e}. Aguardando...")
        
        time.sleep(interval)

    raise TimeoutError(f"Tempo limite de espera para o recurso {url} atingido.")

# Exemplo de uso
# try:
#     wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
#     print(f"Erro no Waiter: {e}")

Variações de implementação:

  • Espera baseada no corpo da resposta: Verificação de um valor ou estrutura específicos no corpo da resposta JSON/XML.
  • Retrocesso exponencial: Aumento do intervalo de espera entre tentativas para reduzir a carga no serviço em caso de tempos de espera frequentes.
  • Waiter parametrizado: Capacidade de passar parâmetros na requisição alvo.
  • Espera condicional: Uso de condições mais complexas, por exemplo, combinação de status e conteúdo da resposta.

O padrão Waiter é útil para aguardar a conclusão de operações assíncronas, a disponibilidade do serviço após uma implantação ou a aparição de dados gerados por outros processos.