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: