Willy: El capítulo de hoy es: CloudFlare : Buenas Practicas. Willy: Patty, hoy toca el arte de vivir bien dentro del plan gratuito de Cloudflare sin descubrir, a mitad del mes, que diseñamos todo al revés. Patty: La clave es elegir bien dónde guardar cada cosa. Por ejemplo, si son datos que cambian poco y se leen mucho —configuración, assets, circuitos o sesiones cortas—, KV encaja muy bien porque está optimizado para lecturas globales baratas. Willy: Pero si tengo usuarios, pedidos o un ranking que crece constantemente, ¿también puedo meterlo en una clave de KV como un JSON enorme? Patty: Poder, puedes; deber, no. Nunca conviene guardar todo el estado de la aplicación en una sola clave. KV permite unas mil escrituras diarias en Free. D1, en cambio, soporta cien mil filas escritas al día, maneja datos relacionales, conteos exactos y actualizaciones frecuentes sin que dos filas distintas se estorben. Willy: Ah, o sea que KV es como un tablón de anuncios, y D1 como una hoja de cálculo bien organizada. ¿Y para una sala de chat o un juego en vivo? Patty: Ahí usaría Durable Objects. Cada instancia tiene un único hilo de ejecución, así que puede actuar como el dueño de una sala, un documento colaborativo, un contador atómico o conexiones WebSocket, manteniendo consistencia fuerte. Willy: ¿Y las imágenes, videos o backups grandes? Patty: R2, especialmente cuando superan 25 MiB. No tiene un límite de tamaño práctico para este caso y el tráfico de salida, el famoso egress, es gratuito. Willy: Otro límite delicado del plan Free son los diez milisegundos de CPU por petición. Suena poquísimo. Patty: Lo es si parseas JSON gigantes, haces bucles largos o cálculos pesados dentro del Worker. El tiempo esperando red no es el problema; el trabajo activo sí. Conviene mandar procesos pesados a Cron Triggers o Queues y resolverlos de forma diferida. Willy: Y si la respuesta es enorme, mejor no construirla completa en memoria, ¿verdad? Patty: Exacto: usa streaming con TransformStream para no acercarte al límite de 128 MB. En Paid puedes configurar hasta cinco minutos de CPU con limits.cpu_ms en wrangler.toml, pero en Free esos diez milisegundos son fijos. Willy: Volvamos a KV. Si cambio nombre, preferencias y último acceso, ¿son tres escrituras? Patty: Mejor agrupar los cambios relacionados en una sola escritura. Para tokens o contadores temporales, usa expirationTtl: Cloudflare los elimina automáticamente y te ahorras la escritura de borrado. Y ojo, las mil escrituras diarias se comparten entre todos los proyectos de la cuenta. Willy: En D1 también hay una optimización sencilla: los índices. Patty: Sí. Una columna usada frecuentemente en WHERE u ORDER BY debería tener índice, porque reduce las filas leídas que cuentan contra la cuota. El índice añade una fila escrita al modificar esa columna, pero normalmente el ahorro en lecturas compensa de sobra. Willy: Para cerrar: hay cosas gratis que conviene exprimir sin culpa. Patty: Totalmente. Los archivos estáticos de Pages tienen peticiones gratuitas e ilimitadas, así que HTML, CSS, JavaScript e imágenes pequeñas deberían salir de ahí, no generarse con Workers. R2 y D1 tampoco cobran egress, ideal para archivos grandes o streaming. Y activa DDoS, SSL, DNS y Bot Fight Mode: cuestan cero y pertenecen al plan de la zona, por lo que no consumen la cuota de Workers. Willy: En resumen: no se trata de usar menos Cloudflare, sino de usar cada pieza para el trabajo correcto. Willy: Patty, hay un riesgo con Cloudflare KV que puede pasar desapercibido: parece una base de datos normal, pero tiene consistencia eventual y admite aproximadamente una escritura por segundo sobre la misma clave. Patty: Ah, o sea que no conviene usar KV para algo como «el primero en llegar gana», porque dos personas podrían escribir casi al mismo tiempo y el orden no estaría garantizado. Willy: Exacto. Tampoco hay atomicidad: normalmente termina ganando la última escritura. Si pueden coincidir varias, mueve ese dato a D1, que permite operaciones transaccionales a nivel de fila. Otra opción es repartir la información: en vez de guardar a todos dentro de una clave llamada «users», usar una clave distinta por usuario. Patty: Como pasar de un único cuaderno compartido a una ficha por persona. Así, dos usuarios distintos no compiten por sobrescribir la misma clave. Willy: Y no esperes a que producción te avise. Si el tráfico está creciendo, revisa semanalmente el panel de Metrics de cada Worker. Configura alertas cuando Cloudflare o tu plan lo permitan y, sobre todo, registra en tu propia aplicación cada fallo de escritura en KV o D1. Patty: Eso permite descubrir un patrón antes de que llegue el clásico mensaje de un usuario: «Guardé algo y desapareció». ¿Qué seguridad mínima pondrías aunque el dominio ya esté en modo proxied? Willy: Si una API pública recibe bots sencillos, activaría Bot Fight Mode. En registro y login usaría Turnstile en lugar de reCAPTCHA: es gratuito, más respetuoso con la privacidad y admite hasta veinte widgets. Patty: ¿Y el rate limiting del propio backend basta? Willy: Conviene sumar al menos una Rate Limiting Rule, que es el límite disponible en Free, y colocarla en la ruta más sensible, por ejemplo login. Esa regla bloquea antes de que la solicitud alcance el Worker, así que también ahorra cuota. Y los secretos siempre fuera del repositorio mediante «wrangler secret put»; poner texto plano en wrangler.toml no crea una variable secreta. Patty: Hablemos de dinero. ¿Cuándo deja de compensar el plan gratuito? Willy: Una regla práctica es migrar a Workers Paid, que parte de cinco dólares mensuales, cuando cumplas dos o más señales: agotaste escrituras KV o filas D1 varias veces en un mes; aparece el error 1102 de CPU durante tráfico normal; necesitas Vectorize, Containers, Pipelines o enviar correos; ya tienes ingresos o usuarios que dependen del servicio; o necesitas builds concurrentes o más de quinientos builds mensuales en Pages. Patty: Antes de cerrar, hagamos diagnóstico rápido. Si ETag e If-None-Match nunca coinciden, puede ser porque la compresión convirtió el ETag en débil, con el prefijo W/. Si un Worker «desaparece» de las rutas, quizá confundiste el plan de la zona con el de Workers: son independientes. Willy: Y si un dominio nuevo de pages.dev dice que no existe, probablemente sea caché DNS negativa, un NXDOMAIN guardado por el proveedor. Suele resolverse solo; mientras tanto puedes probar con DNS 1.1.1.1. Patty: Finalmente, datos perdidos casi simultáneamente apuntan otra vez a KV: no es transaccional y gana la última escritura. Y si algo simplemente falla sin factura ni aviso, en Free puede ser normal: al superar una cuota, la operación falla, pero Cloudflare no cobra automáticamente. Moraleja: diseña para esos fallos silenciosos y mídelo todo. Willy: Creado por wrcp20@gmail.com. Sígueme para más contenido.