Как программно ограничить скорость загрузки на сервере с помощью Scala и воспроизведения

#scala #playframework

#scala #playframework

Вопрос:

Все.

Я работаю над проектом с Play framework и Scala. Мне нужна возможность ограничить скорость загрузки с моего сервера, но точное ограничение зависит от пользователя, поэтому я не могу просто использовать «limit_rate» на моем интерфейсном сервере nginx. Приветствуется любая идея или направление поиска.

Ответ №1:

Из того, что я вижу, нет ничего, что я могу видеть из коробки, что будет делать то, что вы ищете.

Итак, я бы подошел к этому так, чтобы взять вашу собственную версию Play и изменить исходный код, чтобы

  • Объект ответа HTTP содержит поле предельной скорости загрузки, которое вы можете установить, когда вы конкретно хотите ограничить это значение
  • Измените класс PlayHandler (возможно, writeChunk), который отвечает за запись ответа обратно в браузер, так, чтобы он вводил некоторый уровень паузы каждую секунду, чтобы убедиться, что выводится только с требуемой скоростью.

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

Альтернативным методом было бы реализовать ваш собственный метод рендеринга, который расширяет метод RenderBinary, но это ограничивает вас только загрузкой файлов, поэтому может не подходить универсально, но потребует меньше кода для конкретного сценария и может быть выполнено без необходимости изменять какой-либо основной код воспроизведения. Пример пользовательского метода рендеринга можно найти в PDF модуле Николаса Леру

Комментарии:

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

2. Действительно, контроллер будет работать, но у вас будет дублирование кода, если вы попытаетесь повторно использовать это в другом месте.

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