2009-01-02 5 views
4

nous avons ce scénario:grande quantité de données - quelle est la meilleure façon de les envoyer?

Un serveur qui contient les données nécessaires et le composant client que ces données veulent.

Sur le serveur sont stockées 2 types de données: - quelques informations - seulement quelques chaînes essentiellement - données binaires

Nous avons un problème avec l'obtention de données binaires. Les deux parties sont écrits en Java 5 nous avons donc deux façons ....

Web Service n'est pas la meilleure solution en raison de la vitesse, de la mémoire etc ...

Alors, Qu'est-ce que vous préférez?

Je voudrais manquer faible connexion socket niveau si possible ...

merci à l'avance

Vitek

+0

je ne sais pas ce que les bonnes balises devraient être, mais « de » est sûrement pas un d'entre eux ... – hop

Répondre

5

Je pense que la seule façon de faire des quantités importantes de données va être avec accès raw socket.

Vous rencontrerez les problèmes de mémoire insuffisante sur les fichiers volumineux avec la plupart des autres méthodes.

La gestion des sockets est vraiment simple en Java, et elle vous permettra de diffuser les données sans charger le fichier entier en mémoire (ce qui se passe dans les coulisses sans votre propre mise en mémoire tampon). En utilisant cette stratégie, j'ai réussi à construire un système qui permettait le transfert de fichiers arbitrairement volumineux (j'utilisais une image DVD de plus de 7 Go pour tester le système) sans rencontrer de problèmes de mémoire.

1

J'ai essayé de convertir les données binaires à base64, puis l'envoyer par-dessus Les appels SOAP et ça a marché pour moi. Je ne sais pas si cela compte comme un service Web, mais si c'est le cas, alors vous êtes à peu près coincé avec des sockets.

+0

en utilisant base64 est incroyablement inefficace pour les gros morceaux de données. MTOM est probablement un meilleur choix si des services Web sont requis. – Lamar

2

Vous pouvez jeter un oeil à protobuf, c'est la bibliothèque que Google utilise pour échanger des données. C'est très efficace et extensible. Sur un Sidenote, jamais sous-estimer la bande passante d'un break plein de harddisks 1TB!

+0

Très vrai. Cependant, il souffre du problème du «dernier kilomètre»: la connexion USB prendra une éternité pour transférer les données –

+0

eSATA n'est pas à moitié mauvais, et il y a généralement la possibilité d'ouvrir le boîtier et d'utiliser les points de connexion internes. – Guvante

+0

Si vous avez lu la question ci-dessus à propos de la diffusion en streaming principalement les données binaires et la meilleure façon de le faire. Protobuf est plus pour la sérialisation et la désérialisation des données structurées ... pourrait aussi bien utiliser JSON à la place. – JPM

1

Certaines options:

  • Vous pouvez utiliser RMI qui cachera les choses au niveau du socket pour vous, et peut-être gzip les données ... mais si la connexion échoue, il ne reprendra pas pour vous. Probablement rencontrer des problèmes de mémoire aussi.

  • juste HTTP les données avec un type mime binaire (à nouveau peut-être en configurant gzip sur le serveur web). problème similaire sur CV.

  • quelque chose spawn comme wget (je pense que cela peut faire reprendre)

  • si le client a déjà les données (une version précédente de celui-ci), rsync copier uniquement les modifications

0

Qu'en est-il du FTP ancien, abordable et robuste? Vous pouvez par exemple facilement intégrer un serveur FTP dans vos composants côté serveur, puis coder un client FTP. FTP est né exactement pour ça (File Transfer Protocol, n'est-ce pas?), Alors que SOAP avec des pièces jointes n'a pas été conçu pour ça et peut très mal fonctionner. Par exemple, vous pourriez avoir un oeil à:

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

Mais il y a d'autres implémentations là-bas, Apache Mina est juste le premier je me souviens.

Bonne chance & ce qui a trait

0

Est-ce que sneakernet est une option? : P

RMI est bien connu pour sa facilité d'utilisation et ses fuites de mémoire. Être averti. Selon la quantité de données dont nous parlons, sneakernet et sockets sont deux bonnes options.

5

Jetez un coup d'œil à la MTOM standard du W3C pour transférer des données binaires dans le cadre d'un service SOAP. Il est efficace en ce qu'il envoie en tant que binaire et peut également envoyer en tant que morceaux buffered. Il sera également Interop avec d'autres clients ou fournisseurs:

How to do MTOM Interop

Server Side - Sending Attachments with SOAP

Questions connexes