Die Bereitstellung in einer einzelnen Region bedeutet einen einzigen Fehlerpunkt und zusätzliche Latenz für entfernte Ziele. Die Architektur mit mehreren Regionen setzt CAPTCHA-Worker in der Nähe der Zielstandorte ein, reduziert die API-Roundtripzeit und übersteht regionale Ausfälle.
Dieses Muster lohnt sich vor allem dann, wenn Geografie tatsächlich Teil des Problems ist. Wenn Ihre Ziele in einer Region liegen und die Last moderat bleibt, erhöht Multi-Region meist zuerst die Betriebs- und Monitoring-Komplexität, bevor es echten Nutzen liefert.
Schnellentscheidung vor dem Aufbau einer Multi-Region-Architektur
| Frage | Wenn die Antwort ja ist | Wenn die Antwort nein ist |
|---|---|---|
| Zielen Sie auf Standorte in mehreren Kontinenten? | Regionale Verteilung ist plausibel | Eine Region reicht oft aus |
| Haben Sie harte Uptime- oder Failover-Anforderungen? | Multi-Region ist sinnvoll | Halten Sie das Design einfacher |
| Müssen Daten oder Workloads regional verbleiben? | Klare regionale Trennung einplanen | Zusätzliche Regionen oft unnötig |
| Ist das Volumen noch relativ klein? | Erst eine Region stabilisieren und messen | Nicht vorschnell ausbauen |
Architekturübersicht
[Task Router]
(Route53 / Load Balancer)
↙ ↓ ↘
[US-East] [EU-West] [AP-Southeast]
Workers Workers Workers
↓ ↓ ↓
[CaptchaAI API] ← shared API key
↓ ↓ ↓
[Central DB / Queue]
(Results aggregation)
Jede Region beschäftigt unabhängige Arbeiter. Alle nutzen denselben CaptchaAI-API-Schlüssel und übertragen die Ergebnisse an einen zentralen Speicher.
Wenn es auf mehrere Regionen ankommt
| Situation | Einzelne Region | Multiregional |
|---|---|---|
| Zielstandorte in einem Land | Ausreichend | Übertrieben |
| Globale Zielstandorte | 100–300 ms zusätzliche Latenz | Lokale Latenz pro Region |
| 99,9 % Verfügbarkeitsanforderung | Schwer zu garantieren | Natürliche Redundanz |
| Regulatorische Datenresidenz | Kann nicht nachkommen | Lokal verarbeiten |
| < 1.000 Aufgaben/hour | Gut | Unnötige Komplexität |
| > 10.000 Aufgaben/hour | Skalierungsgrenzen | Verteilt die Last |
Regionaler Arbeitnehmereinsatz
Python-Worker (regionsbewusst)
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}
Task-Router
Leiten Sie Aufgaben an die Region weiter, die dem Zielstandort am nächsten liegt:
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
Infrastruktur-Setup
Terraform-Skelett
# 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 (Lokale Simulation mehrerer Regionen)
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
Gesundheitsüberwachung pro Region
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);
Failover-Strategie
Wenn eine Region ausfällt, verteilen Sie ihre Aufgaben neu:
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
Kostenüberlegungen
| Komponente | Kostenfaktor | Optimierung |
|---|---|---|
| Worker-Instanzen | Berechnung pro Region | Automatische Skalierung auf 0 im Leerlauf |
| Regionsübergreifende Datenübertragung | $0,02/GB zwischen Regionen | Minimieren Sie die Größe der Ergebnisnutzlast |
| SQS-Warteschlangen | Preise pro Anfrage | Batch-Nachrichten, sofern möglich |
| CaptchaAI-API | Gleiche Kosten unabhängig von der Region | Keine Prämie für mehrere Regionen |
CaptchaAI berechnet unabhängig vom Standort des Arbeitnehmers die gleichen Tarife – die Mehrregionskosten beziehen sich nur auf die Infrastruktur.
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Worker ist erreichbar, verarbeitet aber keine Aufgaben | Queue, Credentials oder Eingabestrom stimmen nicht | Prüfe Queue-Tiefe, API-Key, Health-Checks und Fehlerraten pro Worker gemeinsam |
| Fehlerrate steigt nach Rollout | Neue Version verändert Session-, Proxy- oder Retry-Verhalten | Vergleiche erfolgreiche und fehlschlagende Runs zwischen alter und neuer Version und rolle bei Bedarf zurück |
| Canary oder Health-Check bleibt rot | Abhängigkeiten, Zeitlimits oder Secrets weichen von der Zielumgebung ab | Prüfe Secrets, Netzwerkpfade und Schwellenwerte in exakt derselben Umgebung |
Verwandte Leitfäden
- Hochverfügbare CAPTCHA-Lösung mit Failover
- Auto-Scaling CAPTCHA-Lösungs-Worker
- CAPTCHA-Lösungsleistung nach Region