DevOps y Escalado

CAPTCHA multirregional resolviendo arquitectura con CaptchaAI

La implementación en una sola región significa un único punto de falla y mayor latencia para objetivos distantes. La arquitectura multirregional implementa trabajadores CAPTCHA cerca de los sitios de destino, reduce el tiempo de ida y vuelta de la API y sobrevive a las interrupciones regionales.

Descripción general de la arquitectura

                    [Task Router]
                    (Route53 / Load Balancer)
                    ↙        ↓        ↘
        [US-East]      [EU-West]     [AP-Southeast]
        Workers        Workers        Workers
            ↓              ↓              ↓
        [CaptchaAI API] ← shared API key
            ↓              ↓              ↓
        [Central DB / Queue]
        (Results aggregation)

Cada región cuenta con trabajadores independientes. Todos comparten la misma clave API CaptchaAI y envían los resultados a un almacén central.

Cuando las múltiples regiones importan

Situación Región única Multiregión
Sitios de destino en un país suficiente exagerado
Sitios de destino globales Latencia añadida de 100 a 300 ms Latencia local por región
Requisito de tiempo de actividad del 99,9% Difícil de garantizar Redundancia natural
Residencia de datos regulatorios no puedo cumplir Procesar localmente
< 1000 tareas/hour Bien Complejidad innecesaria
> 10.000 tareas/hour Límites de escala Distribuye la carga

Política práctica de failover

Señal operativa Acción recomendada Motivo
p95 de una región duplica su línea base durante 5 minutos Dejar de enviar tareas nuevas a esa región Evita amplificar latencia y reintentos cruzados
Errores de proveedor concentrados en una región Redirigir solo envíos nuevos, no el polling ya iniciado El token y la sesión suelen seguir atados al flujo original
Requisito de residencia de datos No hacer failover automático Necesita aprobación explícita para no romper cumplimiento

Despliegue de trabajadores regionales

Trabajador de Python (consciente de la región)

import os
import time
import requests

API_KEY = os.environ["CAPTCHAAI_API_KEY"]
REGION = os.environ.get("WORKER_REGION", "us-east-1")
RESULT_QUEUE_URL = os.environ["RESULT_QUEUE_URL"]


def solve_captcha(task):
    """Solve CAPTCHA and tag with region metadata."""
    start = time.time()

    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": task["method"],
        "googlekey": task["sitekey"],
        "pageurl": task["pageurl"],
        "json": 1
    })
    data = resp.json()

    if data.get("status") != 1:
        return {
            "task_id": task["task_id"],
            "error": data.get("request"),
            "region": REGION
        }

    captcha_id = data["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": captcha_id, "json": 1
        }).json()

        if result.get("status") == 1:
            return {
                "task_id": task["task_id"],
                "solution": result["request"],
                "region": REGION,
                "duration": time.time() - start,
                "api_latency_ms": round((time.time() - start) * 1000)
            }
        if result.get("request") != "CAPCHA_NOT_READY":
            return {
                "task_id": task["task_id"],
                "error": result.get("request"),
                "region": REGION
            }

    return {"task_id": task["task_id"], "error": "TIMEOUT", "region": REGION}

Enrutador de tareas

Enrute las tareas a la región más cercana al sitio de destino:

from urllib.parse import urlparse

# Region mapping by target site TLD/domain
REGION_MAP = {
    ".co.uk": "eu-west-1",
    ".de": "eu-central-1",
    ".fr": "eu-west-3",
    ".jp": "ap-northeast-1",
    ".com.au": "ap-southeast-2",
    ".com": "us-east-1",  # Default
}

REGION_QUEUES = {
    "us-east-1": "sqs://captcha-tasks-us-east",
    "eu-west-1": "sqs://captcha-tasks-eu-west",
    "ap-southeast-1": "sqs://captcha-tasks-ap-southeast",
}


def route_task(task):
    """Route task to the closest regional queue."""
    domain = urlparse(task["pageurl"]).netloc

    target_region = "us-east-1"  # Default
    for suffix, region in REGION_MAP.items():
        if domain.endswith(suffix):
            target_region = region
            break

    queue = REGION_QUEUES.get(target_region, REGION_QUEUES["us-east-1"])
    send_to_queue(queue, task)
    return target_region

Configuración de infraestructura

Esqueleto Terraformar

# Define regions
variable "regions" {
  default = ["us-east-1", "eu-west-1", "ap-southeast-1"]
}

# Deploy worker fleet per region
module "captcha_workers" {
  for_each = toset(var.regions)
  source   = "./modules/captcha-worker"

  region              = each.key
  worker_count        = var.workers_per_region
  api_key_secret_arn  = aws_secretsmanager_secret.captchaai_key.arn
  task_queue_arn      = aws_sqs_queue.tasks[each.key].arn
  result_queue_arn    = aws_sqs_queue.results.arn
}

# SQS queue per region for task intake
resource "aws_sqs_queue" "tasks" {
  for_each = toset(var.regions)
  name     = "captcha-tasks-${each.key}"
}

# Central result queue
resource "aws_sqs_queue" "results" {
  name = "captcha-results-central"
}

Docker Compose (simulación local multirregional)

version: "3.8"
services:
  worker-us:
    build: ./worker
    environment:

      - CAPTCHAAI_API_KEY=${CAPTCHAAI_API_KEY}
      - WORKER_REGION=us-east-1
      - TASK_QUEUE=redis://redis:6379/0
    depends_on:

      - redis

  worker-eu:
    build: ./worker
    environment:

      - CAPTCHAAI_API_KEY=${CAPTCHAAI_API_KEY}
      - WORKER_REGION=eu-west-1
      - TASK_QUEUE=redis://redis:6379/1

  worker-ap:
    build: ./worker
    environment:

      - CAPTCHAAI_API_KEY=${CAPTCHAAI_API_KEY}
      - WORKER_REGION=ap-southeast-1
      - TASK_QUEUE=redis://redis:6379/2

  redis:
    image: redis:7-alpine

Monitoreo de salud por región

javascript

const axios = require("axios");

const REGIONS = ["us-east-1", "eu-west-1", "ap-southeast-1"];

async function checkRegionHealth() {
  const health = {};

  for (const region of REGIONS) {
    const endpoint = `https://${region}.workers.example.com/health`;
    try {
      const start = Date.now();
      const resp = await axios.get(endpoint, { timeout: 5000 });
      health[region] = {
        status: "healthy",
        latencyMs: Date.now() - start,
        activeWorkers: resp.data.activeWorkers,
        queueDepth: resp.data.queueDepth,
      };
    } catch (err) {
      health[region] = { status: "unhealthy", error: err.message };
    }
  }

  return health;
}

// Periodic health check
setInterval(async () => {
  const health = await checkRegionHealth();
  console.table(health);
}, 60000);

Estrategia de conmutación por error

Cuando una región cae, redistribuya sus tareas:

def failover_check(region_health):
    """Redirect tasks from unhealthy regions."""
    healthy_regions = [
        r for r, h in region_health.items()
        if h["status"] == "healthy"
    ]

    if not healthy_regions:
        raise RuntimeError("All regions unhealthy")

    redirects = {}
    for region, health in region_health.items():
        if health["status"] == "unhealthy":
            # Pick the healthy region with lowest queue depth
            target = min(
                healthy_regions,
                key=lambda r: region_health[r].get("queue_depth", 0)
            )
            redirects[region] = target
            print(f"Failover: {region} → {target}")

    return redirects

Consideraciones de costos

Componente Factor de costo Optimización
Instancias de trabajadores Computación por región Escala automática a 0 cuando está inactivo
Transferencia de datos entre regiones $0.02/GB entre regiones Minimizar el tamaño de la carga útil de resultados
colas SQS Precios por solicitud Mensajes por lotes siempre que sea posible
API CaptchaAI Mismo costo independientemente de la región Sin prima multirregional

CaptchaAI cobra las mismas tarifas independientemente de la ubicación del trabajador; el costo multirregional es solo de infraestructura.

Solución de problemas

Problema causa Solución
Una región consistentemente más lenta Distancia de los servidores CaptchaAI Comparar la latencia inicial; se puede esperar
El enrutamiento de tareas envía todo a una región El enrutamiento basado en dominio es demasiado amplio Agregue reglas de enrutamiento más granulares
La conmutación por error no se activa El punto final de verificación de estado no responde Asegúrese de que el punto final de salud esté en una ruta separada de la lógica del trabajador
El saldo de claves API se agota más rápido Todas las regiones comparten una clave Esperado: supervisar el uso agregado

Preguntas frecuentes

¿Necesito claves API CaptchaAI independientes por región?

No. Una clave API funciona globalmente. Utilice una única clave y realice un seguimiento del uso por región a través de sus propias métricas.

¿Cuál es el número mínimo de regiones para alta disponibilidad?

Dos regiones en diferentes áreas geográficas (por ejemplo, EE. UU. + UE) proporcionan HA básica. Tres regiones (EE.UU. + UE + Asia) cubren la disponibilidad global.

¿Debo implementar trabajadores en la misma región que los servidores de CaptchaAI?

La infraestructura de CaptchaAI maneja solicitudes globales. Implemente trabajadores cerca de sus sitios de destino para la optimización del proxy, no cerca de CaptchaAI.

Artículos relacionados

Próximos pasos

Implemente trabajadores CaptchaAI en varias regiones:obtenga su clave APIy construir una infraestructura global de resolución de CAPTCHA.

Guías relacionadas:

Los comentarios están deshabilitados para este artículo.