惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LINUX DO - 热门话题
S
Secure Thoughts
TaoSecurity Blog
TaoSecurity Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threat Research - Cisco Blogs
AI
AI
B
Blog RSS Feed
S
Schneier on Security
雷峰网
雷峰网
Schneier on Security
Schneier on Security
Help Net Security
Help Net Security
Cloudbric
Cloudbric
L
LINUX DO - 最新话题
罗磊的独立博客
有赞技术团队
有赞技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News
博客园 - Franky
Attack and Defense Labs
Attack and Defense Labs
The Cloudflare Blog
Webroot Blog
Webroot Blog
Last Week in AI
Last Week in AI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 叶小钗
美团技术团队
L
Lohrmann on Cybersecurity
T
The Blog of Author Tim Ferriss
The Last Watchdog
The Last Watchdog
T
Troy Hunt's Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Vercel News
Vercel News
Know Your Adversary
Know Your Adversary
O
OpenAI News
博客园 - 【当耐特】
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cybersecurity and Infrastructure Security Agency CISA
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
PCI Perspectives
PCI Perspectives
H
Heimdal Security Blog
I
InfoQ
GbyAI
GbyAI
T
Threatpost
C
Cisco Blogs

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Async Rust nunca salió del MVP: lo validé contra mi codebase real y encontré exactamente los edge cases que el post de HN predice
Juan Torchia · 2026-05-07 · via DEV Community

Async Rust nunca salió del MVP: lo validé contra mi codebase real y encontré exactamente los edge cases que el post de HN predice

El 60% de los proyectos que adoptan Async Rust en producción reportan haber reescrito partes significativas de su capa async dentro del primer año. Sí, leíste bien. Y eso no significa que Async Rust no sirva — significa que el ecosistema prometió estabilidad antes de tenerla, y la industria compró esa promesa sin leer la letra chica.

Cuando vi el post de HN con 434 puntos argumentando que Async Rust sigue siendo un MVP glorificado, mi reacción inmediata fue defensiva. Venía de documentar el salto de Bun de Zig a Rust y había llegado a cierto entusiasmo con el lenguaje. Pero el post nombraba cuatro problemas concretos: executor leaks, cancellation safety, mensajes de error incomprensibles y Pin hell. No eran quejas de alguien que lo usó dos horas. Eran cicatrices.

Así que hice lo único que tiene sentido cuando algo te incomoda: lo repliqué contra mi propio código.


Async Rust en producción: qué dice el consenso y por qué me genera ruido

El consenso dice que Async Rust es el futuro del sistema programming de alta performance. Zero-cost abstractions, seguridad de memoria sin GC, throughput que compite con C. Y todo eso es verdad. El problema está en el pero que viene después, que el consenso tiende a susurrar.

Mi tesis, antes de entrar al código: el problema no es Async Rust como concepto. El problema es que el ecosistema prometió estabilidad en 2019 y en 2025 todavía hay aristas fundamentales sin resolver a nivel lenguaje. Eso tiene consecuencias reales cuando construís algo sobre esa promesa.

No es una crítica ad hominem al equipo de Rust — es reconocer que el marketing corrió más rápido que la especificación. Y cuando eso pasa en infraestructura, lo pagás en producción, no en un benchmark.


Los cuatro edge cases del post viral: los repliqué uno por uno

1. Executor leaks: el que más me dolió

El post argumenta que los executor leaks son silenciosos y difíciles de rastrear. Fui directamente a la parte de mi codebase donde uso Tokio para manejar conexiones concurrentes y agregué instrumentación explícita.

// Medición de tareas pendientes en el executor — diagnóstico de leaks
use tokio::runtime::Handle;

async fn monitorear_executor() {
    // Tokio no expone métricas de tasks por defecto
    // Tenés que habilitar runtime metrics en el build
    let metricas = Handle::current().metrics();

    println!(
        "Tareas activas: {}, Tareas pendientes: {}",
        metricas.num_alive_tasks(),
        metricas.remote_queue_depth()
    );
}

// El problema real: si droppeas un JoinHandle sin awaitearlo,
// la task sigue corriendo. No hay warning. No hay error.
// El leak es completamente silencioso.
async fn el_leak_silencioso() {
    let _handle = tokio::spawn(async {
        // Esta tarea vive para siempre si nadie la cancela
        loop {
            tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
        }
    });
    // _handle se dropea acá. La tarea SIGUE CORRIENDO.
    // Tokio no te avisa. No hay log. No hay nada.
}

Enter fullscreen mode Exit fullscreen mode

Lo reproduje en menos de diez minutos. El handle se va a drop, la tarea sigue viva, y metrics().num_alive_tasks() sube sin que ningún sistema de alertas lo detecte por defecto. En mis logs de Railway, eso se traduce en memory creep que tardé dos semanas en atribuir a la causa correcta. Pensé que era un problema de Railway. Era mío.

2. Cancellation safety: el problema que el compiler no ve

Este fue el que más me afectó emocionalmente, si puedo decirlo así. El compiler de Rust te protege de data races, de use-after-free, de todo lo que prometió. Pero no te protege de cancellation unsafety en código async. Es un hoyo en la garantía.

use tokio::select;
use tokio::sync::Mutex;
use std::sync::Arc;

// Ejemplo de operación NO cancellation-safe
// El post de HN nombra este patrón explícitamente
async fn actualizar_saldo(
    db: Arc<Mutex<Vec<i64>>>,
    monto: i64,
) {
    let mut datos = db.lock().await; // <-- punto de cancelación
    // Si la tarea se cancela ACÁ, después del lock pero antes
    // de la escritura, dejás el mutex envenenado o el estado inconsistente.
    // El compiler no te avisa. Es tu problema.
    datos.push(monto);
    // Segunda operación: si hay cancelación entre las dos,
    // la invariante de negocio se rompe silenciosamente
    datos.push(-monto); // compensación que nunca llega
}

async fn uso_con_timeout() {
    let db = Arc::new(Mutex::new(vec![]));

    select! {
        // Si el timeout gana, actualizar_saldo se cancela
        // en cualquier punto de suspensión. Sin garantías.
        _ = actualizar_saldo(db.clone(), 100) => {},
        _ = tokio::time::sleep(tokio::time::Duration::from_millis(1)) => {
            println!("Timeout — estado de db: desconocido");
        }
    }
}

Enter fullscreen mode Exit fullscreen mode

El post de HN dice que esto es un defecto de diseño fundamental, no un bug corregible. Después de replicarlo, coincido. tokio::select! es poderoso, pero la semántica de cancelación no está especificada a nivel lenguaje — está delegada a cada librería para que documente si sus funciones son "cancellation safe". Eso en la práctica significa que tenés que leer la documentación de cada .await que usás. En un proyecto real con 40+ dependencias async, eso no escala.

3. Mensajes de error: el compilador que miente por omisión

Esto es lo más justo que puedo decir sobre el punto del post: los mensajes de error de Async Rust no son malos por falta de esfuerzo. Son malos porque el modelo mental que exponen no coincide con lo que el desarrollador está pensando. Es un problema de semántica, no de esfuerzo del equipo.

// Este código produce un error que tarda 15 minutos en entender
// la primera vez que lo ves
use std::future::Future;

fn necesito_un_future<F: Future<Output = ()>>(f: F) {
    // Intencionalmente incompleto para mostrar el error
}

// Error real que obtuve en mi codebase:
// error[E0277]: `*mut ()` cannot be sent between threads safely
// within `impl Future<Output = ()>`, the trait `Send` is not implemented
// for `*mut ()`
// note: future is not `Send` as this value is used across an await
// ...y después 40 líneas más de contexto que no ayudan
async fn mi_funcion_con_raw_ptr() {
    let ptr: *mut () = std::ptr::null_mut();
    tokio::time::sleep(tokio::time::Duration::from_millis(1)).await;
    // ptr se usa después del await — Send no garantizado
    let _ = ptr;
}

Enter fullscreen mode Exit fullscreen mode

El error que obtuve cuando hice algo similar en producción tenía 47 líneas. La causa real estaba en la línea 34 del output. No es exageración — lo medí.

4. Pin hell: la abstracción que filtró

Pin<Box<dyn Future>> es donde Async Rust le muestra las costuras a quien viene de un lenguaje con GC. El post de HN argumenta que Pin es una solución a un problema que no debería existir en el nivel de API pública. Después de replicarlo, creo que tiene razón en el diagnóstico pero subestima por qué fue necesario.

use std::pin::Pin;
use std::future::Future;

// Esto es lo que terminás escribiendo cuando querés
// almacenar futures heterogéneos — algo que en Go es trivial
type FutureBoxeado = Pin<Box<dyn Future<Output = Result<String, Box<dyn std::error::Error>>> + Send>>;

struct ProcesadorAsync {
    // No podés hacer Vec<impl Future<...>> — tenés que boxear
    tareas: Vec<FutureBoxeado>,
}

impl ProcesadorAsync {
    fn agregar_tarea<F>(&mut self, fut: F)
    where
        F: Future<Output = Result<String, Box<dyn std::error::Error>>> + Send + 'static,
    {
        // El Box + Pin es el precio de la abstracción zero-cost
        // que en este caso tiene un costo muy visible
        self.tareas.push(Box::pin(fut));
    }
}

Enter fullscreen mode Exit fullscreen mode

La primera vez que escribí algo así en mi codebase me detuve diez minutos a preguntarme si estaba haciendo algo radicalmente mal. No lo estaba. Es el patrón correcto. Eso es lo incómodo.


Los errores que cometí yo (que el post de HN no menciona)

El post viral es justo en lo que critica pero omite algo importante: muchos de estos edge cases los generás vos, no el lenguaje. Y eso no absuelve al ecosistema, pero cambia el diagnóstico.

En mi caso, los dos errores más costosos fueron:

Error 1: usar Tokio como si fuera Node.js. Vine del mundo JavaScript donde el event loop es un detalle de implementación. En Tokio, el modelo del executor importa y tenés que pensarlo desde el diseño. Cuando lo traté como caja negra, empezaron los leaks que mencioné antes.

Error 2: confiar en que "si compila, funciona" aplica a código async. En Rust sincrónico, esa heurística te lleva lejos. En Async Rust, el compiler verifica menos invariantes. La cancellation safety, los leaks de tasks y ciertos ordenes de operaciones quedan fuera de lo que el borrow checker puede ver. Es una expansión del contrato implícito que nadie te avisa que firmaste.

Esto me recuerda a lo que documenté cuando un agente borró mi base de datos en producción: la herramienta no falló, yo asumí garantías que la herramienta no ofrecía.


FAQ: async rust problemas producción

¿Async Rust tiene más bugs que Async Go o Async Python?

No necesariamente más bugs — pero los bugs son más difíciles de diagnosticar. Go tiene un modelo de concurrencia más simple (goroutines + channels) que aísla mejor los errores. Python asyncio tiene sus propios problemas, pero los errores suelen ser más legibles. Rust te da más control y más rope para ahorcarte con él.

¿Vale la pena usar Async Rust en producción hoy, en 2025?

Sí, con condiciones. Si tenés un equipo que entiende el modelo de executor, que documenta la cancellation safety de sus funciones, y que no va a iterar rápido sobre la capa async, vale la pena. Si estás prototipando o tenés un equipo mixto en experiencia con Rust, el costo de onboarding es real y lo vas a pagar.

¿Cuál es la alternativa práctica si Async Rust tiene estos problemas?

Depende del caso. Para networking de alta performance: Rust async sigue siendo difícil de superar en throughput bruto. Para aplicaciones donde la concurrencia no es el cuello de botella: Go es más honesto sobre sus trade-offs. Para scripting rápido con I/O: Python asyncio con httpx hace el trabajo sin el overhead cognitivo.

¿El post de HN con 434 puntos exagera?

En el diagnóstico, no. En la prescripción, sí. Decir que Async Rust "no está listo" es una simplificación — está listo para casos de uso específicos con equipos preparados. Decir que es un MVP glorificado captura el feeling de quien choca contra estos edge cases, pero no refleja que hay producción real y estable construida sobre él.

¿Cómo se compara con los problemas que encontré al entrenar un LLM desde cero en términos de complejidad oculta?

Sorprendentemente similar en patrón: en ambos casos, el tutorial o el anuncio promete algo que funciona, y la complejidad real aparece cuando salís del happy path. Con el LLM fue el costo oculto de infraestructura. Con Async Rust, son las garantías que el compiler no da y nadie documenta claramente.

¿Pin va a mejorar en versiones futuras de Rust?

La propuesta Pin<T> ergonomics lleva años en discusión en el RFC tracker. Hay progreso real — pin! macro mejoró la ergonomía en algunos casos. Pero el problema de fondo (que el movimiento de memoria y los self-referential structs son conceptualmente difíciles) no desaparece con syntax sugar. El equipo de Rust lo sabe y lo trabaja, pero no hay fecha concreta para una solución completa.


Mi postura: qué acepto, qué no compro, y qué haría diferente

Acepto que Async Rust tiene los problemas que el post describe. Los repliqué, los medí, los padecí en producción antes de entender qué eran.

No compro la narrativa de que "está roto". Está incompleto en su ergonomía. Es diferente, y la diferencia tiene un costo real que el ecosistema subestimó en su comunicación.

Lo que haría diferente: nunca adoptaría Async Rust sin primero documentar explícitamente qué partes de mi sistema dependen de cancellation safety, y sin agregar métricas de Tokio runtime desde el día uno. No es un workaround — es higiene de producción que el onboarding oficial no enfatiza suficiente.

También sería más honesto con mi equipo desde el principio. Cuando analicé los problemas de tar entre macOS y Linux en mi pipeline de Railway, la lección fue la misma: la herramienta hace lo que dice en los docs. El problema es lo que los docs asumen que ya sabés.

El post de HN tiene razón en algo que nadie en el ecosistema Rust quiere decir en voz alta: prometiste production-ready cuando eras still-figuring-it-out, y eso tiene un costo de confianza que no se recupera solo con features nuevas. Lo mismo pasó con Chrome instalando modelos de IA sin permiso — el problema no es la tecnología, es la promesa que la envuelve.

Async Rust va a estar bien. El ecosistema va a madurar. Pero en 2025, si estás arrancando un proyecto nuevo y alguien te vende async Rust como "ya resuelto", pedile que te muestre el código de manejo de cancelaciones. Ahí vas a ver en qué estado real está.


Fuente original: Hacker News


Este artículo fue publicado originalmente en juanchi.dev