Comparando aplicaciones TCP / IP vs aplicaciones HTTP [cerrado]

12

Estoy interesado en desarrollar un sitio web orientado al usuario a gran escala escrito en Java.

En cuanto al diseño, estoy pensando en desarrollar servicios modulares independientes que puedan actuar como proveedores de datos para mi aplicación web principal.

Al escribir estos servicios modulares (proveedores de datos), puedo aprovechar un marco existente como Spring y desarrollar estos servicios siguiendo el patrón de diseño REST, y exponer recursos a través de HTTP con un formato de mensaje como JSON ... o puedo aprovechar un marco de red existente como Netty ( enlace ) y un formato de serialización como Protobufs ( enlace ) y desarrolle un servidor TCP que envíe y envíe la carga útil protobuf serializada.

¿Cuándo deberías elegir uno sobre el otro? ¿Habría algún beneficio de usar un formato de serialización como Protobufs y enviar flujos de bytes a través del cable? ¿Habría una sobrecarga en el uso de JSON? ¿Cuánta sobrecarga existe entre el uso de TCP / IP y el uso de HTTP? ¿Cuándo debería usar Spring over Netty, y viceversa para crear dicho servicio?

    
pregunta HiChews123 12.10.2013 - 13:26

2 respuestas

21

Definitivamente hay ventajas y desventajas sobre el uso de JSON sobre REST en comparación con TCP / IP directo con protocolo binario y creo que ya está sospechando que el protocolo binario será más rápido. No puedo decirle exactamente cuánto más rápido (y esto dependería de muchos factores), pero supongo que tal vez de 1 a 2 órdenes de magnitud de diferencia.

A primera vista, si algo es 10-100 veces más lento que otra cosa, es posible que tenga una reacción instintiva y opte por lo "rápido". Sin embargo, esta diferencia de velocidad es sólo en el protocolo en sí. Si hay acceso a la base de datos / archivos en el lado del servidor, no se verá afectado por su elección de la capa de transferencia. En algunos casos, puede hacer que la velocidad de la capa de transferencia sea mucho menos significativa.

HTTP REST y JSON son buenos por varias razones:

  • son fácilmente consumibles por casi cualquier persona. Puede escribir su aplicación web, luego dar la vuelta y publicar su API para que la use el resto del mundo. Ahora cualquier persona puede llegar a los mismos puntos finales y acceder a sus servicios
  • son fáciles de depurar, puede abrir un rastreador de paquetes o simplemente volcar las solicitudes entrantes en archivos de texto y ver qué está pasando. No puedes hacer eso con protocolos binarios
  • son fácilmente extensibles. Puede agregar más atributos y datos más adelante y no interrumpir la compatibilidad con clientes antiguos.
  • consumibles por clientes de javascript (no estoy seguro de que tengan el analizador protobuf JS todavía, no creas que hay uno)

Protobufs sobre TCP / IP:

  • son más rápidos

Si fuera mi elección, me gustaría ir con HTTP REST y JSON. Hay una razón por la que tantas otras compañías y sitios web tomaron esa ruta. También tenga en cuenta que en el futuro siempre podría apoyar 2 puntos finales. Si su diseño es correcto, su elección de punto final debe estar completamente desacoplada de la lógica de negocios del lado del servidor o de la base de datos. Entonces, si se da cuenta más adelante que necesita más velocidad para todas / algunas solicitudes, debería poder agregar protobufs con un mínimo de esfuerzo. Sin embargo, desde el principio, REST / JSON lo despegará más rápido y lo hará más lejos.

En cuanto a Netty vs Spring va. No he usado Netty directamente, pero creo que es solo un servidor web ligero donde Spring es un marco que proporciona mucho más para ti que solo eso. Tiene capas de acceso a datos, programación de trabajos en segundo plano y (creo) un modelo MVC, por lo que es mucho más pesado. ¿Cuál elegir? Si decidió utilizar el método HTTP, entonces la siguiente pregunta es, probablemente, ¿qué tan estándar es su aplicación? Si está a punto de escribir una lógica personalizada loca que no se ajusta al molde estándar y todo lo que necesita es solo una capa de servidor HTTP, vaya con Netty.

Sin embargo, sospecho que su aplicación no es tan especial y probablemente podría beneficiarse de muchas cosas que Spring tiene para ofrecer. Pero eso significa que debe estructurar su aplicación alrededor del marco de Spring y hacer las cosas como ellos esperan que haga, lo que significaría aprender más sobre Spring antes de sumergirse en su producto. Los marcos en general son geniales porque nuevamente lo despiertan más rápido, pero la desventaja es que tiene que encajar en su molde en lugar de hacer su propio diseño y luego esperar que el marco simplemente funcione.

(*): en el pasado, se señaló que mis publicaciones no reflejan las opiniones de todo el mundo, por lo que comentaré y solo agregaré que tengo experiencia limitada con Netty (lo he usado Play framework antes de que se base en Netty) o Spring (solo lo he leído). Así que toma lo que digo con un grano de sal.

    
respondido por el DXM 12.10.2013 - 17:26
0

Esta es una pregunta real. De acuerdo con el protocolo de Internet, tcp es un protocolo en la capa de transporte y http es un protocolo en la capa de aplicación. Estás comparando cosas totalmente diferentes entre sí. (Vea más aquí: enlace )

De hecho, la mayoría de http está sobre tcp / ip. Entonces, para responder a tu pregunta, sí, deberías usar TCP / IP. Luego desea agregar un protocolo de capa de aplicación sobre eso (como http) y luego un formato de datos (como json, xml, html). Netty le permite usar http y protobuff es igual a json, xml, html.

Todo depende de cuáles sean sus requisitos y qué tipo de datos necesitará transportar. ¿Necesita sesiones en su protocolo, puede un protocolo de enlace mejorar la configuración de su protocolo, cuántos datos enviará a la vez, necesita cifrado? Estas son preguntas que debe responder al elegir un protocolo de aplicación.

Para elegir un formato de representación de datos (json, xml, html, protobuff, etc.) depende de su ancho de banda, legibilidad, soporte de idioma / herramienta, etc.

No puedes comparar http a tcp.

Recuerda que la velocidad no lo es todo. La velocidad no sirve de nada si no puedes expresarte de una manera sensata.

    
respondido por el iveqy 12.10.2013 - 16:29

Lea otras preguntas en las etiquetas