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
- Arquitectura del equilibrador de carga Captchaai
- Arquitectura Captcha Resolviendo Api Captchaai
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:
- Resolviendo 10,000 tareas por hora
- Desempeño por región
- Trabajadores de escalado automático