¿Qué es más rápido? ¿Usa la API REST o consulta una base de datos directamente?

16

¿Qué es el rendimiento más rápido sabio? ¿Crear una API REST y hacer que su aplicación web use la API REST para hacer todas las interacciones con su base de datos O consultar su base de datos directamente (es decir, usar cualquier objeto típico que su lenguaje use para consultar una base de datos como JDBC para Java)?

La forma en que lo veo con REST:

  1. Haces un objeto en tu código para llamar al método REST
  2. Llame al método http
  3. El código dentro de su API REST consulta la base de datos
  4. La base de datos devuelve algunos datos
  5. El código REST API empaqueta los datos en Json y los envía a su cliente
  6. El cliente recibe una respuesta Json / XML
  7. Asigna la respuesta a un objeto en tu código

Por otro lado, consultar una base de datos directamente:

  1. Crea un objeto con cadena de consulta para consultar la base de datos
  2. La base de datos devuelve algunos datos
  3. Asigna la respuesta a un objeto en tu código

Entonces, ¿no significa esto que usar una API REST sería más lento? ¿Tal vez depende del tipo de base de datos (SQL vs NoSQL)?

Micro
fuente
3
Una API REST no es un protocolo de acceso a la base de datos, por lo que la pregunta es un gran error de categoría. Una API REST es un almacén de documentos. PODRÍA usar una base de datos en el lado del servidor (o puede que no). Si no necesita una API REST, obviamente no use una. Pero entonces eso vale para todo. Si no necesita una base de datos, no use una, escribir en el sistema de archivos será más rápido que una base de datos. Si no necesita un sistema de archivos, no use uno, escribir en la RAM es más rápido que el disco. Si no necesita RAM, no la use, escribir en el caché de la CPU es más rápido, etc., etc.
Cormac Mulhall
1
El "por otro lado" requiere que expongas tu base de datos al gran mundo malo.
Pieter B
@PieterB: No, "por otro lado" está exponiendo la base de datos a la aplicación web de confianza.
JacquesB
@JacquesB y la aplicación web se ejecuta en la computadora del cliente. Por lo tanto, no se debe confiar porque podría ser una versión modificada.
Pieter B
@PieterB: la pregunta no indica nada sobre la aplicación web que se ejecuta en un servidor no confiable. Esa sería una configuración muy inusual.
JacquesB

Respuestas:

18

Cuando agrega complejidad, el código se ejecutará más lentamente. Introducir un servicio REST si no es necesario ralentizará la ejecución ya que el sistema está haciendo más.

Resumir la base de datos es una buena práctica. Si le preocupa la velocidad, puede analizar el almacenamiento en caché de los datos en la memoria para que no sea necesario tocar la base de datos para manejar la solicitud.

Antes de optimizar el rendimiento, aunque analizaría qué problema está tratando de resolver y la arquitectura que está utilizando, me cuesta pensar en una situación en la que las opciones de la base de datos sean acceso directo frente a REST.

Klee
fuente
+1 por mencionar el almacenamiento en caché. Aunque lo está haciendo extra work. Pero en realidad podría ser más rápido almacenando en caché consultas repetidas.
Yana Agun Siswanto
3
@Klee Tu respuesta no es del todo correcta. »La introducción de un servicio REST si no es necesario ralentizará la ejecución, ya que el sistema está haciendo más.« No en todos los casos hay tráfico hacia el punto final, si, por ejemplo, un proxy inverso podría manejar los resultados caqueados.
Thomas Junk
@klee La razón por la que hice esta pregunta fue de esta publicación SO programmers.stackexchange.com/questions/277701/… : una respuesta habla de cómo Amazon tuvo un gran éxito al usar un sistema completamente RESTful en lugar de acceso directo. Solo me hizo pensar ...
Micro
9

Si le preocupa la velocidad, entonces sí, un servicio de descanso será más lento por las razones indicadas anteriormente. Sin embargo, la velocidad del tipo que describe rara vez es la principal preocupación y, si lo es, puede abordarse de otras maneras. La optimización prematura es la raíz de todo mal .

Considere si su principal preocupación es la interoperabilidad (móvil, web, B2B), ahora REST es muy atractivo porque es independiente de la tecnología.

Supongamos que codifica una base de datos. ¿Qué haría si elige cambiar su almacén de datos subyacente? ¿Qué tan difícil sería hacer si está estrechamente vinculado a la tienda subyacente?

La verdadera respuesta es que depende , ¡pero espero que te haya dado algunas cosas para pensar!

Romski
fuente
6

Si le resulta difícil responder esta pregunta.

La respuesta general correcta debería ser: depende.

La forma en que lo veo con REST:

  1. Haces un objeto en tu código para llamar al método REST
  2. Llame al método http
  3. El código dentro de su API REST consulta la base de datos
  4. La base de datos devuelve algunos datos
  5. El código REST API empaqueta los datos en Json y los envía a su cliente
  6. El cliente recibe una respuesta Json / XML
  7. Asigna la respuesta a un objeto en tu código

Hay un error en tu pensamiento.

Y este error se deriva del hecho de que no comprende completamente REST y sus principios. REST no fue inventado, porque a algunos nerds les pareció genial (por supuesto que sí) enviar objetos Javascript a través de HTTP a través del cable. La principal ventaja de usar HTTP es la posibilidad de usar el almacenamiento en caché . Si hace que sus resultados se puedan almacenar en caché , entonces hay menos solicitudes que hacer a la base de datos. Y no está involucrada la clasificación . La respuesta podría ser entregada directamente.

En la medida en que @Klees la respuesta no es del todo correcta :

Cuando agrega complejidad, el código se ejecutará más lentamente. Introducir un servicio REST si no es necesario ralentizará la ejecución ya que el sistema está haciendo más.

Cuando se trata de resultados almacenables en caché, no hay impacto en su aplicación: la entrega de respuestas conocidas a preguntas conocidas podría hacerse a través de servidores proxy inversos.

Thomas Junk
fuente
44
Si los datos se pueden almacenar en caché en una capa de servicio de reposo, se pueden almacenar en caché en la aplicación web, lo que sería mucho mejor para el rendimiento.
JacquesB
La forma más rápida es no golpear la aplicación web en absoluto.
Thomas Junk
1
Y solo para hacerlo más interesante, no todos los "hits" a la base de datos son iguales si puede acceder en la memoria v. Al disco.
JeffO
@ThomasJunk: si entiendo la pregunta original correcta, el cliente es una aplicación web, y la pregunta es si la aplicación web debe conectarse a la base de datos directamente o llamar a través de un servicio de descanso.
JacquesB
1
Eso no cambia nada en mi respuesta. Llamar a un servicio REST incluye llamar a un servidor web que podría estar detrás de un proxy inverso donde las posibles respuestas podrían almacenarse en caché, como ya dije.
Thomas Junk
2

La introducción de un nivel de servicio adicional siempre tiene un costo en complejidad y sobrecarga de rendimiento. Hay algunos tipos específicos de arquitectura en los que la introducción de un nivel de servicio compartido (como una API REST) ​​puede mejorar el rendimiento debido al almacenamiento en caché compartido, pero parece que no es el tipo de arquitectura que tiene.

Considere una arquitectura en la que tiene múltiples aplicaciones web o múltiples aplicaciones de escritorio que se conectan directamente a la misma base de datos. Si realizan las mismas consultas con frecuencia, puede mejorar el rendimiento para almacenar en caché los resultados de las consultas en un servicio compartido. Especialmente si ha dicho que cientos de aplicaciones de escritorio acceden directamente a la misma base de datos (¡no a través de una aplicación web!) Y realizan las mismas consultas, podría haber una mejora importante. Sin embargo, incluso en esta arquitectura, la razón principal para la introducción de un servicio compartido probablemente sería la seguridad y la abstracción de datos en lugar del rendimiento.

Pero parece que tiene una única aplicación web que se conecta directamente a la base de datos. En ese caso, no es beneficioso introducir una capa de servicio adicional. El almacenamiento en caché, la abstracción de la base de datos, etc. podría manejarse en la capa de acceso a datos en la misma aplicación.

JacquesB
fuente
1

Depende.

Obviamente, cuantas más capas haya en su código, más lento será. Pero ... llega un punto en el que el rendimiento directo de extremo a extremo no importa tanto como la escalabilidad. Si tiene 1 usuario accediendo a su base de datos en una PC local, puede ir rápido. Si tienes miles de usuarios accediendo a la misma base de datos en la misma PC, es probable que los veas frustrados. La solución es mover el DB a otro cuadro, agregar una capa en el medio y, aunque para 1 usuario, funcionará más lentamente, cuando los mil accedan a él, irá más rápido. (Esa es una respuesta simplista pero cierta en principio).

Hay otras razones para ocultar su base de datos detrás de una capa de nivel medio, como la seguridad.

gbjbaanb
fuente
-2

No sé dónde te pierdes, pero está bastante claro, cuando estás usando REST API estás haciendo un paso adicional, y el paso adicional "siempre" significa más lento cuando se trata de programación.

Hay ventajas y desventajas, pero si puede acceder a la base de datos directamente desde su aplicación, siempre es mejor llamarla directamente en lugar de usar la API web, por supuesto, si usa la API web, puede transferir fácilmente su aplicación a una plataforma diferente.

kirie
fuente
1
»No sé dónde te pierdes, pero está bastante claro, cuando estás utilizando REST API estás haciendo un paso adicional, y el paso adicional" siempre "significa más lento cuando la programación está involucrada.« Si eso significa una ejecución más lenta, Eso no está bien.
Thomas Junk
1
¿No hay situaciones en las que acceder a la base de datos es una mala idea además de la portabilidad? A veces, tener una API REST, etc., puede mantener más lógica (¿y mejor seguridad?) En el lado del servidor, ¿verdad?
J Trana
@JTrana que puede ser sí o no, realmente depende de cómo hagas las cosas mientras que la introducción de una capa adicional puede proporcionar una capa adicional de seguridad, agregar una capa adicional también significa que tienes más posibilidades de arruinar algo y exponer un agujero de seguridad. Creo que el objetivo de la API web es exponer su "API". Las aplicaciones grandes como Facebook, Amazon, Google que necesitan proporcionar acceso a terceros y tienen una gran cantidad de plataformas deben tener API web, pero para una aplicación pequeña debes pensar dos veces antes de hacerlo.
kirie
-2

DESCANSO :

  • Abierto a múltiples frontends y 1 backend
  • necesita crear su propia API (o usar una como Loopback)
  • no funciona sin conexión

DB local:

  • no se abren a 'niveles', necesitan tener acceso a su back-end para sincronizar
  • no es necesario crear una API, use la interfaz DB
  • trabajando sin conexión

ESTA ES UNA DIFERENCIA ENORME, LAS PERSONAS A MENUDO OLVIDARON ESTOS PUNTOS

Benjamin Fuentes
fuente
2
-1. Si bien no hay "necesidad" de crear una API, no crear un DAL a menudo conduce a un enorme dolor en caso de que se requiera un cambio de la base de datos. Tampoco hay razón por la cual si tiene la base de datos "fuera de línea", el servicio Rest no podría estar disponible allí también.
James Snell