Servicio REST como servidor de aplicaciones para más de 2000 máquinas cliente. ¿Es una buena idea?

11

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.

Thiago Sayão
fuente
1
Creo que es una idea sensata, especialmente porque REST está diseñado teniendo en cuenta el almacenamiento en caché. Usted puede considerar el uso de websockets para reducir la carga de conexiones de cliente no persistentes, pero esto depende de los patrones de uso de su API. WebSocket comienza a mostrar sus puntos fuertes cuando es posible multiplexar una gran cantidad de pequeñas transacciones de solicitud / resolución en conexiones persistentes. Dicho esto, podría ser más simple escalar ...
blz
8
Las bases de datos nunca deben ser accesibles desde Internet público y siempre deben estar detrás de un firewall; por lo tanto, protegerlas a través de una API REST o similar es un procedimiento estándar. Esto también le permite agregar otras características de seguridad más fácilmente, por ejemplo, evitar que los usuarios editen entradas de datos que no están autorizados para ver o editar.
amon

Respuestas:

3

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.

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);

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.

Es posible tener una base de datos con envío de registros a otra base de datos de solo lectura para atender algunas consultas;

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.

Escalaría mejor ya que podemos agregar más máquinas para ejecutar los servicios REST;

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.

Es posible usar HTTPS con compresión por razones de seguridad y ahorro de ancho de banda;

Sí, así como otras cosas ... tal vez desee autenticación / autorización más adelante, etc.

Es posible realizar algunos cambios centralizados en las entidades comerciales sin volver a implementar las máquinas 2000+;

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.

Se integra mejor con otros sistemas (solo apunte al servicio REST).

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!

Bogdan
fuente
Buena respuesta Solo quería resaltarle a Thiago que vale la pena considerar el versionado en una API RESTful lo antes posible. Es posible que no necesite hacerlo al principio, pero debe ser consciente de ello y estar preparado.
Daniel Hollinrake