Большой объем данных - как лучше всего их отправить? - PullRequest
4 голосов
/ 02 января 2009

у нас есть такой сценарий:

Сервер, который содержит необходимые данные и клиентский компонент, который нужны этим данным.

На сервере хранятся 2 типа данных: - немного информации - просто пара строк в основном - двоичные данные

У нас проблема с получением двоичных данных. Обе стороны написаны на Java 5, поэтому у нас есть несколько способов ....

Веб-сервис - не лучшее решение из-за скорости, памяти и т. Д. *

Итак, что бы вы предпочли?

Я хотел бы пропустить низкоуровневое сокетное соединение, если это возможно ...

заранее спасибо

1017 * Витек *

Ответы [ 8 ]

5 голосов
/ 02 января 2009

Взгляните на стандартную MTOM W3C для передачи двоичных данных как части службы SOAP. Он эффективен в том, что отправляет как двоичный файл, а также может отправлять как буферизованные фрагменты Он также будет взаимодействовать с другими клиентами или поставщиками:

Как сделать MTOM Interop

Сторона сервера - отправка вложений с помощью SOAP

5 голосов
/ 02 января 2009

Я думаю, что единственный способ сделать БОЛЬШОЕ количество данных будет с необработанным доступом к сокету.

Вы столкнетесь с проблемами нехватки памяти на больших файлах большинством других методов.

Работа с сокетами действительно довольно проста в Java, и она позволит вам передавать данные без загрузки всего файла в память (что происходит за кадром без вашей собственной буферизации).

Используя эту стратегию, мне удалось создать систему, которая позволяла передавать произвольно большие файлы (я использовал образ DVD объемом 7 ГБ для тестирования системы) без проблем с памятью.

2 голосов
/ 02 января 2009

Возможно, вы захотите взглянуть на protobuf , это библиотека, которую Google использует для обмена данными. Это очень эффективно и расширяемо. На заметку: никогда не стоит недооценивать пропускную способность универсала, заполненного жесткими дисками емкостью 1 ТБ!

1 голос
/ 02 января 2009

Некоторые опции:

  • Вы можете использовать RMI, который будет скрывать для вас данные на уровне сокетов, и, возможно, сжать данные ... но если соединение не будет установлено, оно не возобновится для вас. Вероятно, возникнут проблемы с памятью.

  • просто HTTP данные с двоичным типом MIME (опять же, возможно, настройка gzip на веб-сервере). аналогичная проблема с резюме.

  • порождает что-то вроде wget (я думаю, это может возобновить)

  • если у клиента уже есть данные (предыдущая версия), rsync скопирует только изменения

1 голос
/ 02 января 2009

Я попытался преобразовать двоичные данные в Base64, а затем отправить их через вызовы SOAP, и это сработало для меня. Я не знаю, считается ли это веб-службой, но если это так, то вы в значительной степени застряли в сокетах.

0 голосов
/ 02 января 2009

Рассмотрим GridFTP в качестве транспортного уровня. Смотри также этот вопрос .

0 голосов
/ 02 января 2009

Является ли sneakernet опцией? : P

RMI хорошо известен своей простотой использования и утечками памяти. Имейте в виду. В зависимости от того, сколько данных мы говорим, sneakernet и сокеты являются хорошими вариантами.

0 голосов
/ 02 января 2009

А как насчет старого, доступного и надежного FTP? Например, вы можете легко встроить FTP-сервер в серверные компоненты и затем кодировать FTP-клиент. FTP был рожден именно для этого (протокол передачи файлов, не так ли?), В то время как SOAP с вложениями не был разработан с учетом этого и может работать очень плохо. Например, вы можете взглянуть на:

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

Но есть и другие реализации, Apache Mina - только первая, которую я могу вспомнить.

Удачи и всего наилучшего

...