La resolución DNS es un coste invisible en cada llamada a la API CAPTCHA. Cada vez que tu código llama a ocr.captchaai.com, el sistema puede realizar una búsqueda DNS, añadiendo entre 5 y 200 ms según tu proveedor DNS, el estado de la caché y las condiciones de red. Esta guía explica cuándo DNS se convierte en un cuello de botella y cómo eliminarlo.
Cómo afecta el DNS a la resolución de CAPTCHA
Una única resolución de CAPTCHA implica de 5 a 7 solicitudes HTTP (1 envío + 4 a 6 consultas). Sin almacenamiento en caché de DNS:
| Escenario | Búsquedas DNS | Latencia agregada |
|---|---|---|
| Sin caché, DNS lento (200 ms cada una) | 7 | 1.400 ms |
| Caché DNS a nivel de SO (solo primera llamada) | 1 | 200 ms |
| Keep-alive activo (0 búsquedas nuevas) | 0 | 0 ms |
| Pre-resolución DNS + keep-alive | 0 | 0 ms |
Clave: Si ya usas HTTP keep-alive (conexiones persistentes), DNS no es tu problema: la misma conexión TCP reutiliza la IP resuelta. DNS importa principalmente cuando se crean conexiones nuevas por solicitud.
Cuando el DNS importa
La resolución DNS se convierte en un cuello de botella cuando:
- Nuevas conexiones por solicitud: sin
Session(Python) ni agente keep-alive (Node.js) - Arranque en frío sin servidor o contenedor: sin DNS en caché en instancias nuevas
- Proveedores de DNS lentos: DNS de ISP predeterminado sin caché local
- Muchos workers arrancando simultáneamente: sin DNS en caché en arranques paralelos
Python: optimización de DNS
Verificar el comportamiento actual de DNS
import socket
import time
# Measure DNS resolution time
hostname = "ocr.captchaai.com"
start = time.time()
ip = socket.getaddrinfo(hostname, 443)
first_resolve = time.time() - start
start = time.time()
ip = socket.getaddrinfo(hostname, 443)
second_resolve = time.time() - start
print(f"First resolve: {first_resolve*1000:.1f}ms")
print(f"Second resolve: {second_resolve*1000:.1f}ms (OS cached)")
Resolución anticipada de DNS y caché
import os
import socket
import requests
from urllib3.util.connection import create_connection
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
# Pre-resolve the API hostname
CAPTCHAAI_IP = socket.getaddrinfo("ocr.captchaai.com", 443)[0][4][0]
print(f"Resolved ocr.captchaai.com to {CAPTCHAAI_IP}")
# Patch connection to use cached IP
DNS_CACHE = {"ocr.captchaai.com": CAPTCHAAI_IP}
class CachedHTTPAdapter(requests.adapters.HTTPAdapter):
def send(self, request, **kwargs):
return super().send(request, **kwargs)
# Use with Session for fastest resolution
session = requests.Session()
session.headers.update({"Connection": "keep-alive"})
# The session already maintains keep-alive, so DNS is resolved once
# For the first request, the OS cache handles subsequent lookups
resp = session.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "getbalance", "json": "1",
})
print(f"Balance: {resp.json()}")
Usa un servidor DNS con menor latencia medida
Configure su sistema o aplicación para utilizar DNS público rápido:
# For systems where you control DNS configuration:
# /etc/resolv.conf (Linux) or system DNS settings
# Recommended: Cloudflare (1.1.1.1) or Google (8.8.8.8)
# In Python, you can also use dnspython for explicit resolution
import dns.resolver
resolver = dns.resolver.Resolver()
resolver.nameservers = ["1.1.1.1", "8.8.8.8"]
answers = resolver.resolve("ocr.captchaai.com", "A")
for answer in answers:
print(f"Resolved: {answer}")
JavaScript: optimización de DNS
Medir la resolución DNS
const dns = require('dns');
const { performance } = require('perf_hooks');
const hostname = 'ocr.captchaai.com';
// First resolution
const start1 = performance.now();
dns.lookup(hostname, (err, address) => {
const time1 = performance.now() - start1;
console.log(`First resolve: ${time1.toFixed(1)}ms → ${address}`);
// Second resolution (OS cached)
const start2 = performance.now();
dns.lookup(hostname, (err2, address2) => {
const time2 = performance.now() - start2;
console.log(`Second resolve: ${time2.toFixed(1)}ms → ${address2}`);
});
});
Resolución anticipada con caché DNS
const dns = require('dns');
const https = require('https');
const axios = require('axios');
const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
// Pre-resolve and cache
let cachedIP = null;
async function preResolve() {
return new Promise((resolve, reject) => {
dns.lookup('ocr.captchaai.com', (err, address) => {
if (err) reject(err);
cachedIP = address;
console.log(`Cached IP: ${cachedIP}`);
resolve(address);
});
});
}
// Use keep-alive agent (DNS resolved once per connection)
const agent = new https.Agent({
keepAlive: true,
maxSockets: 20,
keepAliveMsecs: 60000,
});
const api = axios.create({
baseURL: 'https://ocr.captchaai.com',
httpsAgent: agent,
timeout: 30000,
});
(async () => {
await preResolve();
const resp = await api.get('/res.php', {
params: { key: API_KEY, action: 'getbalance', json: '1' },
});
console.log(`Balance: ${resp.data}`);
})();
Entornos sin servidor y de contenedores
En contenedores AWS Lambda, Google Cloud Functions y Docker:
| Entorno | Comportamiento de la caché DNS | Recomendación |
|---|---|---|
| AWS Lambda | En caché dentro del contexto de ejecución, perdida en arranque en frío | Pre-resolución en el handler init |
| Google Cloud Functions | En caché dentro de la instancia | Pre-resolución en alcance global |
| Docker | Usa el DNS del host por defecto | Configura --dns 1.1.1.1 |
| Kubernetes | CoreDNS con caché configurable | Establece ndots: 1 en la configuración DNS del pod |
Solución de problemas
| Problema | Causa | Solución |
|---|---|---|
| Primera llamada lenta, las demás son rápidas | Búsqueda DNS en la primera llamada | Normal con caché del SO; usa keep-alive |
| Todas las llamadas son lentas (+100 ms) | Sin caché DNS, resolución lenta | Configura DNS en 1.1.1.1 o 8.8.8.8 |
| Picos de latencia aleatorios | Expiración del TTL de la caché DNS | Aumenta el TTL de la caché local o usa pre-resolución |
| Arranque en frío de contenedor lento | Sin DNS en caché en la nueva instancia | Pre-resolución en el código de inicialización |
Preguntas frecuentes
¿Realmente vale la pena optimizar DNS para resolver CAPTCHA?
Para la mayoría de las configuraciones con conexiones permanentes, el DNS se resuelve una vez y se reutiliza. Es importante principalmente para entornos sin servidor, arranques en frío o al crear nuevas conexiones por solicitud.
¿Qué proveedor de DNS debo utilizar?
Cloudflare (1.1.1.1) y Google (8.8.8.8) suelen ofrecer baja latencia como solucionadores DNS públicos. Mide desde tu propia región antes de estandarizar.
¿CaptchaAI utiliza varias direcciones IP?
Sí. DNS puede devolver diferentes IPs en las búsquedas. Es el comportamiento normal de load balancing. El keep-alive mantiene la IP resuelta durante toda la vida de la conexión.
Guías relacionadas
- Conexión keep-alive y HTTP/2 para la API CAPTCHA
- Benchmarking de tiempos de resolución con CaptchaAI
- Optimización de latencia de la API CaptchaAI