Renderizado de Datos que No Coinciden

Rate this content
Bookmark

Los datos devueltos desde un endpoint a una aplicación frontend deben reflejar el estado del mundo en un momento (¡reciente!) en el pasado. ¡Pero puede que no lo hagan! Y los datos devueltos desde múltiples endpoints a menudo reflejan el estado del mundo en múltiples momentos. ¿Qué se puede hacer y qué se debe hacer? ¿Cuál es el peor escenario que podría suceder y cuál es el peor que razonablemente, probablemente va a suceder?

Hablemos de las compensaciones, veamos cómo algunos equipos lo abordan y escuchemos cuánto les importa realmente.

This talk has been presented at React Advanced 2024, check out the latest edition of this React Conference.

Thomas Ballinger
Thomas Ballinger
11 min
28 Oct, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Hola, soy Tom y quiero hablar sobre el renderizado de datos que pueden no coincidir al usar consultas SQL. Es importante considerar si estas consultas están en la misma transacción o en transacciones separadas, ya que esto afecta el renderizado de datos. Implementar transacciones puede asegurar consultas de datos atómicas y evitar inconsistencias. Gestionar la consistencia de datos en React puede ser un desafío, especialmente con clientes ricos y actualizaciones en vivo. React Query ofrece formas de manejar la lógica de invalidación de datos. La obtención de datos asíncrona en React puede llevar a datos inconsistentes entre solicitudes.
Available in English: Rendering Data That Disagree

1. Rendering Inconsistent Data with SQL Queries

Short description:

Hola, soy Tom y quiero hablar sobre la representación de datos que pueden no coincidir, específicamente al usar consultas SQL para recuperar datos de una base de datos. Es importante considerar si estas consultas están en la misma transacción o en transacciones separadas, ya que esto afecta cómo se representan los datos. En algunos casos, puede haber inconsistencias visuales que se pueden resolver actualizando la página, pero en otros casos, las inconsistencias pueden tener un impacto significativo en la experiencia del usuario. Es crucial que los desarrolladores comprendan las posibles inconsistencias y aseguren que los datos sean consistentes.

Hola, soy Tom, y quiero hablar sobre la representación de datos que no coinciden. Así que digamos que estás representando una página web. Y tal vez estés usando componentes del servidor, tal vez sea un componente del cliente que está haciendo SSR, tal vez estés de vuelta en el mundo de PHP o Python o Perl o Ruby, y necesitas obtener algunos datos.

Probablemente los obtendrás de una base de datos. Y entonces lanzas tu primera consulta SQL, que es un select para obtener todos los usuarios que están en un canal de chat dado, y luego lanzas otra consulta SQL para obtener todos los mensajes en ese canal. Y ahora tienes los datos que necesitas. Puedes simplemente representar esta cosa.

Esto es discourse o mi favorito, Zulip. Y en el centro, tenemos un montón de mensajes en un canal de chat y a la derecha, tenemos los usuarios que están en ese canal de chat. Pero con suerte, con esa primera descripción del problema, tu mente fue a, ah, pero ¿están esas dos consultas SQL en la misma transacción? ¿Son como aquí? ¿Estas son dos consultas que se ejecutan en transacciones separadas o están en la misma transacción? Esa es información importante para nosotros porque nos dice qué podemos hacer con esos datos.

¿Qué pasa si primero lees tus usuarios y luego se agrega un nuevo usuario al canal y ellos también publican un mensaje y luego lees tus mensajes? Estos agregar un usuario y agregar un mensaje podrían ser una acción atómica que podría suceder juntos. Podría ser un mensaje de unión o algo así. Y si los leemos así, leemos usuarios y luego leemos mensajes, y asumimos que cada mensaje tiene un usuario correspondiente, vamos a estar decepcionados. Este es uno de esos casos donde, bueno, veamos. ¿Qué podría pasar? Tal vez sea solo una inconsistencia visual. Tal vez todo lo que sucede es que ves esta página y dices, oh, eso es curioso. Hay una persona aquí, pero no hay nadie correspondiente en esa cosa de usuarios. A menudo no importa. Y a menudo lo que haces, lo que nuestros usuarios están entrenados para hacer es actualizar la página.

Para bien o para mal, así es como siempre ha funcionado la web. Como, uh-oh. Tal vez es eventualmente consistente. Actualizas y todo está mejor. Pero tal vez esa inconsistencia visual es un gran problema. Tal vez esa es la diferencia entre pensar que tengo mis boletos de Taylor-Tomlinson y no tengo mis boletos de Taylor-Tomlinson. Tal vez veo algo, es una compra, y algo me confunde allí y realmente me preocupo como usuario. Pero tal vez no son dos interfaces de usuario separadas. Tal vez es una interfaz de usuario y tengo código que espera ambas piezas de datos. Estoy asumiendo que cada mensaje tiene un usuario correspondiente, y de lo que trata esta charla es que es tu trabajo saber si esos datos podrían ser inconsistentes.

2. Implementing Transactions for Data Consistency

Short description:

Al acceder a datos de un map en TypeScript, es importante considerar la posibilidad de que falten usuarios. Ignorar errores de TypeScript puede llevar a problemas significativos, como usuarios faltantes en una lista. Al implementar transacciones, podemos asegurar que las consultas de datos sean atómicas y evitar inconsistencias. Es crucial abordar cualquier error relacionado con datos faltantes, ya que indican problemas fundamentales con el modelo de datos. Aunque los datos consistentes son deseables, no siempre son alcanzables, especialmente cuando se trabaja con múltiples bases de datos o APIs.

Y conoces este error de TypeScript que vemos mucho, donde tienes un map y dices, oh, creo que es un map de cada usuario. Y miras allí para obtener un usuario por ID y dice, uh-oh, lo que buscabas no está allí, y siempre simplemente pones un signo de exclamación al final porque, por supuesto que está allí. Se suponía que esta era una lista completa. Bueno, en este caso, no podemos ignorar ese mensaje de TypeScript. ¿Qué pasa si nos faltan usuarios? Y no podemos ignorarlo porque esto es lo que sucede, ¿verdad?

Esto es algo bastante malo. Si es mejor o peor que una inconsistencia visual, supongo que es debatible. Pero en general, quiero decir que es peor. Así que hay una idea interesante, llamada transacción. Y si estas dos consultas hubieran estado en la misma transacción, no estaríamos preocupados aquí. Y entonces, si obtuviéramos un error, sería un error muy accionable. Sería, oye, algo está fundamentalmente mal con tu modelo de datos. Si tu base de datos devolvió estas dos listas, y terminaste con un mensaje sin usuario, hay algo realmente mal aquí, ¿verdad? En lugar de la alternativa de que los usuarios simplemente se quejan a veces de que, ah, parece que los datos están cargando mucho. Y cuando esa es cómo una inconsistencia, una inconsistencia fundamental en tus datos se manifiesta, porque has codificado alrededor de algunos usuarios simplemente no tienen algunos mensajes no tienen usuarios. Y eso está bien. Sabes, lleva más tiempo encontrar problemas en tu sistema. Los datos consistentes pueden significar que esos errores del lado del cliente son significativos. Pero no siempre puedes tener datos consistentes. Tal vez estés obteniendo estos datos de múltiples bases de datos o varias APIs. Así que el trabajo de ti como desarrollador front end o de React aquí es saber que estos son consistentes.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Todo Más Allá de la Gestión de Estado en Tiendas con Pinia
Vue.js London Live 2021Vue.js London Live 2021
34 min
Todo Más Allá de la Gestión de Estado en Tiendas con Pinia
Top Content
State management is not limited to complex applications and transitioning to a store offers significant benefits. Pinia is a centralized state management solution compatible with Vue 2 and Vue 3, providing advanced devtools support and extensibility with plugins. The core API of Pinia is similar to Vuex, but with a less verbose version of stores and powerful plugins. Pinia allows for easy state inspection, error handling, and testing. It is recommended to create one file per store for better organization and Pinia offers a more efficient performance compared to V-rex.
Uso efectivo de useEffect
React Advanced 2022React Advanced 2022
30 min
Uso efectivo de useEffect
Top Content
Today's Talk explores the use of the useEffect hook in React development, covering topics such as fetching data, handling race conditions and cleanup, and optimizing performance. It also discusses the correct use of useEffect in React 18, the distinction between Activity Effects and Action Effects, and the potential misuse of useEffect. The Talk highlights the benefits of using useQuery or SWR for data fetching, the problems with using useEffect for initializing global singletons, and the use of state machines for handling effects. The speaker also recommends exploring the beta React docs and using tools like the stately.ai editor for visualizing state machines.
React Query: ¡Es hora de romper con tu "Estado Global"!
React Summit Remote Edition 2020React Summit Remote Edition 2020
30 min
React Query: ¡Es hora de romper con tu "Estado Global"!
Top Content
Global state management and the challenges of placing server state in global state are discussed. React Query is introduced as a solution for handling asynchronous server state. The Talk demonstrates the process of extracting logic into custom hooks and fixing issues with state and fetching logic. Optimistic updates with mutation are showcased, along with the benefits of using React Query for data fetching and mutations. The future of global state management is discussed, along with user feedback on React Query. The Talk concludes with an invitation to explore React Query for server state management.
Los Átomos de Jotai Son Simplemente Funciones
React Day Berlin 2022React Day Berlin 2022
22 min
Los Átomos de Jotai Son Simplemente Funciones
Top Content
State management in React is a highly discussed topic with many libraries and solutions. Jotai is a new library based on atoms, which represent pieces of state. Atoms in Jotai are used to define state without holding values and can be used for global, semi-global, or local states. Jotai atoms are reusable definitions that are independent from React and can be used without React in an experimental library called Jotajsx.
Anunciando Starbeam: Reactividad Universal
JSNation 2022JSNation 2022
27 min
Anunciando Starbeam: Reactividad Universal
Starbeam is a library for building reactive user interfaces with JavaScript, similar to Svelte, Vue, and Ember. It provides a data structure and query feature for filtering and sorting. The useStarBeam function ensures JSX reconciliation only occurs when reactive dependencies change. Starbeam tracks every read and write operation to update the component accordingly. It can be used with React and other frameworks, and offers debugging tools and locale integration.
Pensando en React Query
React Summit 2023React Summit 2023
22 min
Pensando en React Query
Top Content
React Query is not a data fetching library, but an Asian state manager. It helps keep data up to date and manage agent life cycles efficiently. React Query provides fine-grained subscriptions and allows for adjusting stale time to control data fetching behavior. Defining stale time and managing dependencies are important aspects of working with React Query. Using the URL as a state manager and Zustand for managing filters in React Query can be powerful.

Workshops on related topic

Repensando el Estado del Servidor con React Query
React Summit 2020React Summit 2020
96 min
Repensando el Estado del Servidor con React Query
Top Content
Featured Workshop
Tanner Linsley
Tanner Linsley
La distinción entre el estado del servidor y el estado del cliente en nuestras aplicaciones puede ser un concepto nuevo para algunos, pero es muy importante entenderlo cuando se entrega una experiencia de usuario de primera calidad. El estado del servidor viene con problemas únicos que a menudo se cuelan en nuestras aplicaciones sorpresa como:
- Compartir datos entre aplicaciones- Caché y Persistencia- Deduplicación de Solicitudes- Actualizaciones en segundo plano- Gestión de Datos "Obsoletos"- Paginación y Recuperación Incremental- Memoria y Recolección de Basura- Actualizaciones Optimistas
Los gestores tradicionales de "Estado Global" pretenden que estos desafíos no existen y esto finalmente resulta en que los desarrolladores construyan sus propios intentos sobre la marcha para mitigarlos.
En esta masterclass, construiremos una aplicación que expone estos problemas, nos permite entenderlos mejor, y finalmente los convierte de desafíos a características usando una biblioteca diseñada para gestionar el estado del servidor llamada React Query.
Al final de la masterclass, tendrás una mejor comprensión del estado del servidor, el estado del cliente, la sincronización de datos asíncronos (un bocado, lo sé), y React Query.
Gestión del estado en React con Context y Hooks
React Summit Remote Edition 2021React Summit Remote Edition 2021
71 min
Gestión del estado en React con Context y Hooks
WorkshopFree
Roy Derks
Roy Derks
Mucho ha cambiado en el mundo de la gestión del estado en React en los últimos años. Donde Redux solía ser la principal biblioteca para esto, la introducción de las API de Contexto y Hooks de React ha revolucionado las cosas. Ya no necesitas bibliotecas externas para manejar tanto el estado del componente como el estado global en tus aplicaciones. En este masterclass aprenderás los diferentes enfoques para la gestión del estado en la era post-Redux de React, ¡todos basados en Hooks! Y como bonificación, exploraremos dos próximas bibliotecas de gestión del estado en el ecosistema de React.