DevOps & Skalierung

Multiregionale CAPTCHA-Lösungsarchitektur mit CaptchaAI

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
Kommentare sind für diesen Artikel deaktiviert.