Есть ли лучший способ предоставить результаты дорогостоящего блокирующего процесса python через HTTP?

StackOverflow https://stackoverflow.com/questions/1929681

  •  20-09-2019
  •  | 
  •  

Вопрос

У нас есть веб-сервис, который обслуживает небольшие произвольные сегменты фиксированного списка файлов MP3 большего размера.Файлы MP3 генерируются "на лету" приложением python.Модель такова: сделайте запрос GET на URL-адрес, указывающий, какие сегменты вы хотите, получите audio/mpeg поток в ответ.Это дорогостоящий процесс.

Мы используем Nginx в качестве интерфейсного обработчика запросов.Nginx заботится о кэшировании ответов на распространенные запросы.

Изначально мы пытались использовать Tornado на серверной части для обработки запросов от Nginx.Как и следовало ожидать, блокирующая операция MP3 не позволила Tornado выполнить свое задание (асинхронный ввод-вывод).Итак, мы перешли на многопоточность, что решило проблему блокировки, и работали довольно хорошо.Однако это привело к незначительному состоянию гонки (при нагрузке в реальном мире), которое мы пока не смогли диагностировать или воспроизвести.Состояние гонки искажает наш вывод MP3.

Поэтому мы решили настроить наше приложение как простой обработчик WSGI за Apache / mod_wsgi (все еще без / Nginx впереди).Это устраняет проблему блокировки и состояние гонки, но создает каскадную нагрузку (т.е.Apache создает слишком много процессов) на сервере в реальных условиях.Прямо сейчас мы работаем над настройкой Apache / mod_wsgi, но все еще на этапе проб и ошибок.(Обновление:мы снова переключились на Торнадо.Смотрите ниже.)

Наконец, вопрос:мы что-нибудь упускаем?Есть ли лучший способ обслуживать дорогостоящие ресурсы процессора через HTTP?

Обновить: Благодаря информированной статье Грэма, я почти уверен, что это проблема настройки Apache.Тем временем мы вернулись к использованию Tornado и пытаемся решить проблему с повреждением данных.

Для тех, кто так быстро решил использовать больше железа для решения проблемы, Tornado и немного многопоточности (несмотря на проблему целостности данных, возникающую из-за многопоточности) приемлемо справляются с нагрузкой на маленькое (одноядерное) устройство Экземпляр Amazon EC2.

Это было полезно?

Решение

Вы совершаете ошибку, используя встроенный режим Apache / mod_wsgi?Читать:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

Убедитесь, что вы используете режим демона, если используете Apache/mod_wsgi.

Другие советы

Вы пробовали Нерест?Это сервер WSGI с гибким набором режимов потоковой передачи.

Вы могли бы рассмотреть систему массового обслуживания с методами уведомления AJAX.

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

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

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

Именно так работают КРУПНЫЕ медиа-сайты - те, которым приходится иметь дело, в частности, с видео.Однако это может оказаться излишеством для вашей работы в формате MP3.

Альтернативно, рассмотрите возможность запуска пары машин для распределения нагрузки.Ваши потоки в Apache по-прежнему будут блокироваться, но, по крайней мере, вы не будете потреблять ресурсы веб-сервера.

Пожалуйста, определите "каскадную нагрузку", поскольку это не имеет общего значения.

Ваша наиболее вероятная проблема будет заключаться в том, что вы запускаете слишком много процессов Apache.

Для такой нагрузки убедитесь, что вы используете prefork mpm, и убедитесь, что вы ограничиваете себя соответствующим количеством процессов (не менее одного на процессор, не более двух).

Похоже, вы все делаете правильно - просто не хватает мощности процессора:можете ли вы определить, какова загрузка процессора в процессе генерации этих MP3?

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

Кстати, масштабирование для Интернета было темой Основной лекции Джейкоба Каплана-Мосса на PyCon Brasil в этом году, и это далеко не закрытая проблема.Набор технологий, с которыми нужно работать, довольно впечатляющий - (однако я не смог найти онлайн-копию презентации - извините за это)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top