Ограничить пропускную способность / скорость загрузки файла в сервлете - PullRequest
6 голосов
/ 21 февраля 2011

мы получили высоконагруженное Java-приложение, которое работает в кластерном режиме.

Мне нужно добавить возможность загружать и загружать файлы для наших клиентов.Для хранения файлов я собираюсь использовать пользовательские gridFs, не уверен, что это лучший выбор, но монго может быть кластеризовано, и монго может реплицировать данные между узлами diff.Это именно то, что мне нужно.

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

Большинство из них работает одинаково.

  • Чтение пакета байтов
  • Спящий поток
  • Повтор

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

Может ли это быть проблемой для контейнера сервлета?

Если это может быть проблемой, как ее можно избежать?вероятно, используя nio?

Я предпочитаю использовать чистое решение Java.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

10 голосов
/ 21 февраля 2011

Leaky bucket или token bucket алгоритмы могут использоваться для управления пропускной способностью сети.

РЕДАКТИРОВАТЬ: я сделал несколько быстрых прототипов и реализовал алгоритм, использующий асинхронную обработку Servlet 3.0. Результаты довольно хорошие. Полный исходный код можно найти на GitHub . Веселись!

1 голос
/ 21 февраля 2011

Также я боюсь, что пользователи могут создавать много параллельных потоков во время загрузки, что может снизить производительность.

Может ли это быть проблемой для контейнера сервлета?

Да, может.

Если это может быть проблемой, как ее можно избежать?вероятно, используя nio?

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

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

...