DevOps ve Ölçeklendirme

CaptchaAI ile Çok Bölgeli CAPTCHA Çözme Mimarisi

Tek bölgeli dağıtım, tek bir hata noktası ve uzak hedefler için ilave gecikme anlamına gelir. Çok bölgeli mimari, CAPTCHA çalışanlarını hedef sitelerin yakınına dağıtır, API gidiş-dönüş süresini azaltır ve bölgesel kesintilerden kurtulur.

Mimariye Genel Bakış

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

Her bölgede bağımsız çalışanlar çalıştırılır. Hepsi aynı CaptchaAI API anahtarını paylaşır ve sonuçları merkezi bir depoya aktarır.

Çoklu Bölge Önemli Olduğunda

Durum Tek Bölge Çoklu Bölge
Bir ülkedeki siteleri hedefleyin Yeterli Aşırı öldürme
Küresel hedef siteler 100-300 ms ilave gecikme Bölge başına yerel gecikme
%99,9 kesintisiz çalışma gereksinimi Garanti etmek zor Doğal artıklık
Düzenleyici veri yerleşimi Uyum sağlanamıyor Yerel olarak işle
< 1.000 görev/hour iyi Gereksiz karmaşıklık
> 10.000 görev/hour Ölçeklendirme sınırları Yükü dağıtır

Bölgesel İşçi Dağıtımı

Python Çalışanı (Bölge Duyarlı)

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}

Görev Yönlendiricisi

Görevleri hedef siteye en yakın bölgeye yönlendirin:

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

Altyapı Kurulumu

Terraform İskeleti

# 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 (Yerel Çoklu Bölge Simülasyonu)

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

Bölge Bazında Sağlık İzleme

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);

Yük Devretme Stratejisi

Bir bölge çöktüğünde görevlerini yeniden dağıtın:

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

Maliyet Hususları

Bileşen Maliyet Faktörü Optimizasyon
Çalışan örnekleri Bölge başına işlem Boştayken otomatik olarak 0'a ölçeklendir
Bölgeler arası veri aktarımı Bölgeler arasında 0,02$/GB$ Sonuç verisi boyutunu en aza indirin
SQS kuyrukları İstek başına fiyatlandırma Mümkün olduğunda toplu mesajlar
CaptchaAI API'si Bölgeden bağımsız olarak aynı maliyet Çoklu bölge primi yok

CaptchaAI, çalışanın konumuna bakılmaksızın aynı oranları ücretlendirir; çoklu bölge maliyeti yalnızca altyapıdır.

Yük devretme politikası

  • Gecikme, hata oranı veya proxy durumu politika eşiğini aştığında yeni görevlerin bozulmuş bir bölgeye yönlendirilmesini durdurun.
  • Her kuyruğu ve oturumu aniden değiştirmek yerine, uçuş sırasındaki işleri bilinçli olarak boşaltın.
  • Trafiği yalnızca bölge, yük devretmeden önce kullanılan sistem durumu kapılarını karşıladıktan sonra devam ettirin.

Sorun giderme

Sorun Sebep Düzeltme
Bir bölge sürekli olarak daha yavaş CaptchaAI sunucularına olan mesafe Temel gecikmeyi karşılaştırın; beklenebilir
Görev yönlendirme her şeyi bir bölgeye gönderir Etki alanı tabanlı yönlendirme çok geniş Daha ayrıntılı yönlendirme kuralları ekleyin
Yük devretme tetiklenmiyor Durum denetimi uç noktası yanıt vermiyor Sistem durumu uç noktasının çalışan mantığından ayrı bir yolda olduğundan emin olun
API anahtar bakiyesi daha hızlı tükeniyor Tüm bölgeler bir anahtarı paylaşıyor Beklenen – toplam kullanımın izlenmesi

SSS

Bölge başına ayrı CaptchaAI API anahtarlarına ihtiyacım var mı?

Hayır. Tek bir API anahtarı global olarak çalışır. Tek bir anahtar kullanın ve kendi ölçümleriniz aracılığıyla bölge başına kullanımı izleyin.

Yüksek kullanılabilirlik için minimum bölge sayısı nedir?

Farklı coğrafi bölgelerdeki iki bölge (örneğin ABD + AB) temel HA sağlar. Üç bölge (ABD + AB + Asya) küresel kullanılabilirliği kapsamaktadır.

Çalışanları CaptchaAI sunucularıyla aynı bölgeye mi yerleştirmeliyim?

CaptchaAI'nin altyapısı küresel talepleri karşılar. Proxy optimizasyonu için işçileri CaptchaAI'ye değil, hedef sitelerinize yakın bir yere konuşlandırın.

İlgili Makaleler

Sonraki Adımlar

CaptchaAI çalışanlarını birden fazla bölgeye dağıtın -API anahtarınızı alınve küresel CAPTCHA çözme altyapısı oluşturun.

İlgili kılavuzlar:

Bu makale için yorumlar devre dışı bırakılmıştır.