Construiremos un sistema con la interfaz de usuario en javaFx que se implementará en más de 2000 máquinas (el mínimo es 2000, pero será más, puede llegar a 5000 máquinas).
Por otras razones / limitaciones, debe instalarse en la máquina, por lo que no podemos hacerlo con una interfaz de navegador web.
Las más de 2000 máquinas estarán en diferentes grupos de ubicación geográfica. En general, la conexión es buena, pero puede no ser tan buena en ubicaciones más remotas.
En lugar de acceder a la base de datos directamente, estoy pensando en crear un clúster de servicio REST con Spring + Spring Boot + Spring Data (java).
El servicio REST aceptaría y devolvería a Json.
Creo que es una buena idea porque:
- El servicio actuaría como un grupo de conexiones de base de datos (creo que más de 2000 conexiones en una base de datos causarían problemas);
- Es posible tener una base de datos con envío de registros a otra base de datos de solo lectura para atender algunas consultas;
- Escalaría mejor ya que podemos agregar más máquinas para ejecutar los servicios REST;
- Es posible usar HTTPS con compresión por razones de seguridad y ahorro de ancho de banda;
- Es posible realizar algunos cambios centralizados en las entidades comerciales sin volver a implementar las máquinas 2000+;
- Se integra mejor con otros sistemas (solo apunte al servicio REST).
¿Es realmente una buena idea?
¿Puedes compartir alguna experiencia positiva o negativa?
Gracias.
Respuestas:
Esta es una pregunta abierta con muchas respuestas posibles que dependen de lo que intente hacer. Sin embargo, agregaré algunas cosas como respuesta, ya que un comentario no será lo suficientemente grande.
Si esa es una buena idea. Mantiene un número menor de conexiones abiertas y las reutiliza a medida que llegan solicitudes al servicio. Pero necesita saber qué tan rápido se atenderán las solicitudes y cuánto utiliza cada solicitud la base de datos, de lo contrario, un pequeño grupo se puede agotar fácilmente y otras solicitudes se bloquearán mientras se espera que se libere una conexión de base de datos.
El almacenamiento en caché puede ayudar allí, para devolver datos ya recuperados (como dije, depende de lo que intente hacer; si las consultas son únicas, no puede almacenar mucho en caché).
También tenga en cuenta que el tamaño de la agrupación se multiplicará por la cantidad de servicios que haya implementado. Algunos servicios y puede utilizar grandes tamaños de agrupaciones de bases de datos; más servicios y necesita disminuir el tamaño del grupo, de modo que tenga la misma cantidad de conexiones abiertas a la base de datos, en general.
La base de datos puede convertirse fácilmente en su cuello de botella. Demasiadas conexiones y / o demasiadas consultas y puede romperlas. En ese momento, no importa que pueda escalar horizontalmente sus servicios a cualquier número. Todas las solicitudes eventualmente llegarán a la misma base de datos.
Hay varias formas de protegerlo: el almacenamiento en caché que ya mencioné (depende de su caso de uso), duplicar cierta información en otros servidores para atender algunas consultas como usted menciona, CQRS (depende de su caso de uso), usar un sistema relacional versus no relacional (depende de su caso de uso nuevamente), etc.
Sin embargo, tenga en cuenta que cuando distribuye datos como ese, el teorema CAP comienza a aplicarse. Tenga en cuenta eso, ya que es posible que deba comprometer la consistencia y la disponibilidad.
Sí, el servicio REST escalará, pero como mencioné anteriormente, si no protege la base de datos, eso puede convertirse fácilmente en un cuello de botella.
Sí, así como otras cosas ... tal vez desee autenticación / autorización más adelante, etc.
Sí, pero hasta cierto punto y no todo tipo de cambios. Si realiza un cambio importante, también deberá actualizar los clientes. Así que piense en una estrategia para actualizar los clientes a la última versión o si permite que los clientes más antiguos sigan trabajando y usen la aplicación.
Sí, pero eso significa clientes para su servicio que quizás no pueda controlar.
Si realiza un cambio importante y tiene una buena estrategia para actualizar sus más de 2000 clientes JavaFX, entonces no hay problema. Pero si existen otros clientes y usted no tiene control sobre ellos, es posible que necesite implementar versiones en el servicio REST y admitir más de una versión hasta que todos puedan actualizar a la última.
Como dije, depende de lo que intentes hacer. En general, la tuya es una buena idea. Pero tenga en cuenta que las cosas no serán gratuitas solo porque coloque un servicio REST frente a una base de datos.
¡Solo mis 2 centavos!
fuente