Обмен файлами (до многих ГБ) - PullRequest
1 голос
/ 17 марта 2019

Для моего проекта мне нужно создать файловый менеджер, который предназначен для хранения множества файлов (из разных мест) и предоставления URL для их загрузки.

В микросервисной экосистеме (я привык использовать весеннюю загрузку), мне интересно, как лучше обмениваться такими файлами, я имею в виду отправку файлов в файловый менеджер?

С одной стороны, я всегда думал, что лучше обмениваться ими асинхронно, поэтому HTTP не кажется хорошим выбором. Но, возможно, я ошибаюсь.

Является ли хорошим выбором разделить файлы на фрагменты (чтобы уменьшить количество байтов для каждой части) и отправить каждый из них через что-то вроде RabbitMQ или Kafka? Или лучше передать целые файлы на NAS или через FTP и позволить файловому менеджеру их обрабатывать? Или что-то еще, например, хранение байтов во временной базе данных (может быть, не очень удачный выбор) ...

Проблема фрагментации заключается в том, что я должен реализовать логику для сохранения сортировки каждого фрагмента, что усложняет обработку очередей тем.

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

IMO, никогда не отправляйте реальные файлы через посредник сообщений.

Сначала настройте некоторую систему хранения объектов, например S3 (с AWS или локально с Ceph), затем отправьте путь к файлу в виде строки с производителем, затем попросите потребителя прочитать этот путь и загрузить файл.

Если вы хотите собирать файлы с NAS или FTP, то Apache NiFi - это один из инструментов, который имеет разъемы для подобных систем.

1 голос
/ 17 марта 2019

На основе моего профессионального опыта работы с распределенными системами (на основе JMS), для передачи огромного контента между участниками:

  • для запроса следует использовать подход фрагментов - модель ответа + управляющие сигналы (имеет следующий, счетчик фрагментов)
  • дельта-подход для обновлений.

Чтобы избежать повреждения данных, результат хеш-функции также может быть передан и проверен в обоих сценариях.

Но, как упоминалось в этой ветке электронной почты , лучшим подходом является использование FTP для таких сценариев:

RabbitMQ на самом деле не должен использоваться для передачи больших файлов или только с большой осторожностью и фрагментируя файлы на более мелкие отдельные сообщения.

При запуске одного экземпляра брокера вы все равно будете в безопасности, но в кластерная установка, очень большие сообщения сломают кластер. Кластерные узлы подключаются через 1 TCP-соединение, которое также должно транспортировать (эрланг) сердцебиение. Если ваше большое сообщение занимает больше времени передача между узлами, чем тайм-аут сердцебиения (где-нибудь между ~ 20-45 секунд, если я прав), кластер сломается и ваш сообщение потеряно Предпочтительной архитектурой для передачи файлов через amqp является просто отправить сообщение со ссылкой на скачиваемый ресурс и файл передача будет обрабатываться по специальному протоколу, например, ftp: -)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...