Pregunta

tenemos este escenario:

Un servidor que contiene los datos necesarios y el componente del cliente que estos datos quieren.

En el servidor se almacenan 2 tipos de datos:  - alguna información - solo un par de cadenas básicamente  - datos binarios

Tenemos un problema con la obtención de datos binarios. Ambas partes están escritas en Java 5, por lo que tenemos dos formas ...

El servicio web no es la mejor solución debido a la velocidad, la memoria, etc.

Entonces, ¿qué preferirías?

Me gustaría perder la conexión de socket de bajo nivel si es posible ...

gracias de antemano

Vitek

¿Fue útil?

Solución

Creo que la única forma de hacer GRANDES cantidades de datos será con acceso a sockets sin procesar.

Llegará a los problemas de falta de memoria en archivos grandes con la mayoría de los otros métodos.

El manejo de sockets es realmente bastante sencillo en Java, y le permitirá transmitir los datos sin cargar todo el archivo en la memoria (que es lo que sucede detrás de escena sin su propio almacenamiento en búfer).

Utilizando esta estrategia, logré construir un sistema que permitía la transferencia de archivos arbitrariamente grandes (estaba usando una imagen de DVD de 7+ GB para probar el sistema) sin tener problemas de memoria.

Otros consejos

Eche un vistazo al MTOM estándar del W3C para transferir datos binarios como parte de un servicio SOAP. Es eficiente porque se envía como un binario y también puede enviar como fragmentos almacenados en búfer. También interactuará con otros clientes o proveedores:

Cómo hacer MTOM Interop

Lado del servidor - Envío de archivos adjuntos con SOAP

Es posible que desee echar un vistazo a protobuf , esta es la biblioteca que google utiliza para intercambiar datos. Es muy eficiente y extensible. En una nota al margen, ¡nunca subestimes el ancho de banda de una camioneta llena de discos duros de 1TB!

He intentado convertir los datos binarios a Base64 y luego enviarlos a través de llamadas SOAP y funcionó para mí. No sé si eso cuenta como un servicio web, pero si lo hace, entonces estás prácticamente atascado con sockets.

Algunas opciones:

  • Podría usar RMI que ocultará las cosas de nivel de socket para usted, y tal vez gzip los datos ... pero si la conexión falla, no se reanudará para usted. Probablemente también encuentre problemas de memoria.

  • simplemente HTTP los datos con un tipo mime binario (de nuevo quizás configurando gzip en el servidor web). problema similar en el currículum.

  • genera algo como wget (creo que esto puede reanudarse)

  • si el cliente ya tiene los datos (una versión anterior), rsync copiará solo los cambios

¿Qué pasa con el FTP antiguo, asequible y robusto? Por ejemplo, puede incrustar fácilmente un servidor FTP en los componentes del lado del servidor y luego codificar un cliente FTP. FTP nació exactamente para eso (Protocolo de transferencia de archivos, ¿no es así?), Mientras que SOAP con archivos adjuntos no se diseñó con esas cosas en mente y puede funcionar muy mal. Por ejemplo, podría echar un vistazo a:

http://mina.apache.org/ftpserver/

Pero hay otras implementaciones por ahí, Apache Mina es solo la primera que recuerdo.

Buena suerte y amperio; saludos

¿Es sneakernet una opción? : P

RMI es bien conocido por su facilidad de uso y sus pérdidas de memoria. Ten cuidado. Dependiendo de cuántos datos estamos hablando, sneakernet y sockets son buenas opciones.

Considere GridFTP como su capa de transporte. Consulte también esta pregunta .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top