Primero, vamos a mirar un panel financiero aquí, y lo que voy a hacer es simular algo de latencia en una respuesta de API donde estamos haciendo una solicitud en el servidor para poder obtener datos, para poder tenerlos en el HTML inicial y enviarlos al cliente. Lo que sucede en este caso es que porque estamos haciendo este trabajo en, digamos, get server-side props en Next.js, todo está bloqueado. No estás enviando nada al cliente hasta que las solicitudes se resuelvan, y digamos que esas solicitudes toman un tiempo súper largo, tu tiempo de renderizado más rápido solo puede ser tan rápido como tu solicitud más lenta. Y así, en algún momento, puede que quieras implementar una estrategia donde te retires de algo que está tomando demasiado tiempo, y los navegadores tienen tiempos de espera mucho más largos para tales cosas, tal vez incluso hasta 30 segundos, por lo que puede que quieras tener tus propios personalizados para esto. Así que este es un ejemplo de cómo eso puede haber sido implementado para ese panel financiero. Tienes un get server-side props, estamos haciendo un prefetch aquí con algún tipo de solicitud para estas transacciones, estamos deshidratando eso, estamos pasando en los props, y lo que podemos añadir es una capa encima que es solo una función para crear ese prefetch donde tal vez pasamos un tiempo de espera de algún tipo que usa un promise.race bajo el capó, y pasamos un tiempo de espera de 500 milisegundos o algo más, tal vez incluso un tiempo de espera de dos segundos, y luego dependiendo de si el tiempo de espera se activa primero o los resultados de la solicitud primero, entonces podemos retirarnos de eso, y luego porque no habrá caché listo en el lado del cliente cuando tenga lugar la hidratación, Tanstack query hará coincidir las claves de consulta e intentará esencialmente asegurarse de que tenemos esos datos siendo obtenidos en el lado del cliente, en lugar de intentar prepararlos en el lado del servidor. En este caso, estamos creando una gran experiencia de usuario en el mejor de los casos, pero en condiciones subóptimas, todavía estamos optimizando para la experiencia del usuario y retirándonos de esas condiciones. Otra forma de abordar esto, si tienes una versión más reciente de Next.js o estás trabajando con una pila mucho más moderna, puedes implementar streaming que te permite iniciar esa misma solicitud en el servidor y llevarla al cliente, y todo puede resolverse a su manera, y no estás bloqueando nada, esencialmente. Así que Next.js 16.3 vale la pena probar para este tipo de cosas con pre-renderizado parcial, técnicas geniales que puedes hacer para añadir resiliencia y asegurarte de que estás haciendo trabajo bloqueante con suspense.
La siguiente pregunta que quiero hacer es si alguien ha oído hablar del patrón de compartimentos estancos antes. Manos arriba. Bien, un par de personas. Puedo garantizar que al menos el 50 por ciento si no el 90 por ciento de las personas aquí han usado un patrón de compartimentos estancos antes. Así que el patrón de compartimentos estancos aísla una parte de un sistema en un grupo separado, aísla una parte de él que falla, o se sobrecarga, o algo sucede que no impacta el resto del sistema. Límites de error, ¿verdad? ¿Alguien aquí ha oído hablar de límites de error? Eso es muchas más manos. Así que, patrones de compartimentos estancos, algo que es más un término más amplio de ingeniería de software, nuevamente, algo que usamos todos los días, pero es realmente bueno poder asociar estos patrones, y así, ¿quién aquí está simplemente lanzando un límite de error global en la aplicación y están contentos con eso? Veo eso muy, muy, muy comúnmente. Así que no nos sorprende cuando vemos un escenario como este donde tenemos múltiples piezas diferentes de UI y luego, boom, error de aplicación, o voy a escribir algo aquí y luego de repente escribo lo incorrecto, voy a fallar de nuevo, ¿verdad? ¿Por qué una parte de la UI está impactando una parte no relacionada de la UI? E incluso más allá de eso, si abro Sentry, y solo estaba capturando Sentry, lo que sea lo crudo que estaba recibiendo de esos errores siendo lanzados, veo error, error de tipo, error. ¿Alguien sabe qué está pasando? Le preguntaría al patito de goma, pero está un poco cansado ahora mismo. Bien. Así que, creo que eso también es un poco inaceptable no poder diagnosticar lo suficientemente rápido, así que realmente quiero que pienses en tratar de construir cuadrantes cuando se trata de límites de error, tratando de aislar lo más cerca posible de donde crees que la funcionalidad relevante debería estar delimitada, y así, mirando este límite de error de cuadrante, estamos haciendo un par de cosas aquí. La primera cosa es que en realidad vamos a definir algo llamado etiqueta de error, y veremos cómo eso es útil en un segundo. Cada vez que defines un límite de error, pasas una etiqueta de error y usas el sistema de tipos para asegurarte de que termina en error, pero no importa si solo termina en error, puedes esencialmente usar la plantilla de cadena para poder poner error de límite al final, o estás aprovechando el sistema de tipos para imponer algún nivel de etiquetado que puedes propagar a tu herramienta de reporte de errores como Sentry para hacerlo mucho más fácil de depurar cuando una pieza delimitada de tu aplicación falla. En ese componente, luego se pasa eso a esta función de reporte de error, que toma esta etiqueta de error, y luego, en eso, esencialmente estamos creando un nuevo error a partir de eso, pasando el original como causa, y luego reportamos eso a Sentry. ¿Cómo se ve cuando comenzamos a aislar las cosas un poco más cerca de donde están yendo mal? No solo tenemos ahora UIs únicas que existen solo para donde las cosas están yendo mal, como, si mi barra de navegación está rota y por alguna razón falla, ¿por qué mis widgets también deberían sufrir como resultado? Puedes entonces tener experiencias de usuario que están adaptadas a los fallos que están ocurriendo. Pero más allá de eso, porque estás pasando etiquetas de error, ahora recibes cosas como error de cuenta regresiva de temporizador error de renderizado de entrada, puedes aislar exactamente dónde en la base de código ocurrió el problema, y eso significa que porque también estás usando el sistema de tipos para garantizar que todos son identificadores únicos, lo que puedes hacer es simplemente copiar y pegar lo que sea el título de ese error en tu IDE, buscar por él, y sabes exactamente dónde ocurrió ese error en lugar de tener que recorrer un rastro de pila. Porque muchos de nosotros nos sentimos súper abrumados cuando recibimos muchos mensajes de Slack y alertas de cuántos errores ocurren en Sentry, cuántos errores ocurren que recibimos por correo electrónico. A veces simplemente silenciamos e ignoramos esos canales, y lo que es genial es que recibiremos un correo electrónico como este con un error de botón no funciona, y sé exactamente qué salió mal en mi aplicación, y puedo clasificar efectivamente en lugar de sentirme abrumado. Pero en general, ¿cómo medimos el éxito con esto? Y ahí es donde quiero hablar un poco sobre las métricas dora. ¿Alguien aquí ha oído hablar de las métricas dora antes? Un poco sobre las métricas de investigación y evaluación de DevOps, y se centran en cuatro cosas principales. Frecuencia de despliegue, con qué frecuencia despliegas código, tiempo de espera para cambios, tiempo desde el compromiso de código hasta la ejecución en producción, tiempo medio de recuperación, que es qué tan rápido se restaura un servicio después de un incidente, y tasa de fallos de cambio, el porcentaje de cambios que causan incidentes. Ahora, ¿por qué me encantan tanto estas métricas? Porque creo que a veces hemos sobre-glorificado la cobertura de pruebas unitarias a veces, o todas estas otras métricas que son mucho más fáciles de manipular, y estoy seguro de que estas métricas dora también pueden ser manipuladas, pero muchos de nosotros nos enfocamos mucho en cuántas pruebas unitarias tenemos, o cuántas nuestras IA están generando, pruebas de integración, pruebas de extremo a extremo, qué reglas de lint, cómo están nuestros perfectos archivos Cloud MD, o lo que sea que sea.
Comments