Esto es genial cuando tienes un estado relativamente pequeño. Pero nuestro estado es enorme. Equipos, canales, publicaciones, los problemas de memoria estaban destinados a ser.
El siguiente problema está relacionado con el soporte offline. Toda la información tiene que ser persistida en la forma y luego cargada de nuevo. Y la aplicación no puede iniciar si ciertas partes del estado no están cargadas. Pero todo el estado tiene que ser cargado. Por lo tanto, la carga inicial tomará más tiempo.
Y el problema final era el multiservidor. No era posible implementar multiservidor. ¿Por qué? Porque los problemas que acabo de mencionar se multiplican por el número de servidores volviéndose completamente no escalables.
Así que decidimos movernos a WatermelonDB. ¿Por qué? El estado se almacena en una database similar a SQL, por lo que no es necesario tenerlo completamente cargado en memoria en ningún momento. Solo necesitamos obtenerlo de la database. ¿Pero no es eso más lento? Dado que el estado de la consulta es cache, tal vez sea más lento en la primera consulta. Pero siempre que se acierte en la cache, no debería dar problemas.
Luego toda la reactivity al estado usa RxJS. Y podemos crear bases de datos separadas para cada servidor, ayudando mucho con esa aislación. Al final del día, WatermelonDB nos trajo un sistema más escalable listo para multiservidor.
Pero no todo es maravilloso. WatermelonDB también tuvo desafíos. Entre otras cosas, RxJS es nuevo en el stack de Mattermost, por lo que necesita una curva de aprendizaje más empinada para los equipos de características del resto de la empresa. El modelo de data es un modelo de data relacional de database, por lo que es más rígido, y eso lleva a cuidar las migraciones de database, que en general suenan más como un problema de back-end que un problema de front-end. Y tristemente, WatermelonDB no soporta hooks, y tienes que confiar en componentes de alto orden.
Pero aparte de todo eso, usar WatermelonDB ha valido la pena. Y te mostraré un poco sobre ello. Acceder a la database es sencillo. Hemos puesto todas las consultas en la carpeta de consultas, y son mayormente tres. Obtener un solo valor de la database, observar un solo valor para cambios, y crear consultas más complejas que pueden ser obtenidas o observadas. Obtener el estado de la database en un componente tampoco es complicado.
Comments