Mi nombre es Chris. Trabajo para Axiom, que es la aplicación que acabas de ver, y en el mundo de código abierto, soy conocido por algunas contribuciones a CreateT3App y TRPC y algunos otros proyectos.
Entonces, ¿cómo manejas 10 millones de elementos? Bueno, mi recomendación es simplemente no hacerlo. Ahora, por supuesto, este no es un consejo muy útil, pero quiero ser serio aquí. Intenta evitarlo. Este tipo de trabajo toma mucho tiempo que podrías gastar en arreglar errores, escribir nuevas características, y así sucesivamente, y también hace que tu base de código sea mucho más difícil para la próxima persona que trabaje en ella.
Creo que a muchos de nosotros nos encanta esta idea de resolver problemas tecnológicos muy interesantes, pero lo que necesitas pensar es, ¿es esta la mejor manera de gastar tu tiempo para hacer la vida de tus usuarios mejor? La forma de saber si necesitas esto o no es escuchar a tus clientes y ver cuáles son sus frustraciones. La otra cosa que puede ayudarte a averiguar si necesitas esto o no es desarrollar consistentemente contra un servidor real con datos reales de una escala similar a la que tienen tus usuarios más grandes.
Entonces, si debes evitarlo, ¿cómo puedes hacerlo? Va a depender de tu situación, pero hay muchas opciones aquí. Puedes usar paginación, obteniendo 10, 20 o 100 resultados a la vez. Puedes usar transmisión, obteniendo solo los resultados específicos que actualmente se necesitan. O tal vez ni siquiera necesitas los elementos individuales, solo necesitas ejecutar algún tipo de agregación sobre ellos. En ese caso, puedes hacerlo del lado del servidor, o en muchos casos, incluso en la base de datos. Y la última cosa que quiero señalar es que si tu propietario de producto pide esto, realmente sugeriría negociar los requisitos y averiguar por qué quieren esto. Tal vez te estén presentando un problema XY, y realmente hay una solución mucho mejor, como una de las tres cosas anteriores.
Pero digamos que has negociado, has pensado en esto, has considerado las alternativas, y has llegado a la conclusión de que la única manera de hacer que tu aplicación sea buena es mostrar millones de elementos a la vez. ¿Qué haces ahora? Lo primero que es muy importante es medir antes de comenzar a optimizar. Hay una buena posibilidad de que estés completamente equivocado sobre dónde están tus cuellos de botella. Hay tres cosas principales para medir, computación, memoria y red, y veremos cada una de ellas más adelante.
Así que ahora que hemos pasado la introducción, hablemos sobre las cosas específicas que nos ayudaron en nuestra situación. Voy a omitir algunos detalles de implementación aquí, así que mostraré algunas cosas que no representan uno a uno cómo se comporta Axiom en producción. Pero estos detalles son muy específicos de nuestra situación, y creo que terminaremos con una charla más útil de esta manera.
Así que aquí está el punto de partida. Es finales de 2023, y el trazado en Axiom funciona muy bien, hasta alrededor de 5000 spans. Pero no sabíamos esa última parte en ese momento, porque ¿por qué alguien querría crear trazas tan grandes? Y luego lanzamos un nuevo plan de precios, y la gente se dio cuenta de que podían usar nuestro trazado como una herramienta de perfilado sin incurrir en grandes costos, y así lo hicieron, y no pudimos manejarlo. Esto es lo que sucedió si intentabas abrir una traza con incluso solo 10,000 spans. Creo que puedes ver por el mensaje de error que ni siquiera habíamos considerado esta posibilidad o esta forma de fallar.
Después de una rápida investigación, nos dimos cuenta de que realmente teníamos que repensar toda la arquitectura del visor de trazas. Así que veamos lo que hicimos paso a paso para mejorar nuestra capacidad en varios órdenes de magnitud. Ahora, este conjunto inicial de errores no se originó realmente en el front end.
Comments