Как я могу масштабировать веб-приложение с длительным временем отклика, которое в настоящее время использует Django - PullRequest
1 голос
/ 12 ноября 2010

Я пишу веб-приложение с django на стороне сервера. Для генерации ответа пользователю требуется ~ 4 секунды. Это использует погодный API. Мое приложение должно сделать ~ 50 запросов к этому API для каждого пользовательского запроса.

Серверная часть использует urllib из python для использования API погоды. Я использовал потоки питонов, чтобы ускорить процесс, потому что urllib является синхронным. Я использую WSGI с Apache. Проблема в том, что стек wsgi полностью синхронизирован, и когда многие пользователи используют мое приложение, им приходится ждать завершения запроса друг друга. Поскольку каждый запрос занимает ~ 4 секунды, это недопустимо.

Я застрял, что я могу сделать?
Спасибо

Ответы [ 2 ]

0 голосов
/ 12 ноября 2010

Если вы используете mod_wsgi в многопоточной конфигурации или даже в многопроцессной конфигурации, один запрос не должен блокировать другой от возможности что-либо сделать.Они должны быть в состоянии работать одновременно.Если вы используете многопоточную конфигурацию, уверены ли вы, что не используете какой-либо механизм блокировки для какого-либо ресурса в вашем собственном приложении, который препятствует выполнению запросов через один и тот же раздел кода?Другая возможность состоит в том, что вы плохо настроили режим демона Apache MPM и / или mod_wsgi, чтобы исключить одновременные запросы.поиск в первую очередь или разгрузка на клиента.

0 голосов
/ 12 ноября 2010

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

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

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

Редактировать: основываясь на ваших комментариях, то, что вы запрашиваете, вероятно, не может быть оптимизировано в рамках ограничений используемого вами API. Проблема заключается в том, что служба хорошо справляется с абстрагированием различий во многих источниках информации о погоде, которые они объединяют в запрос ближайшего местоположения. В конце концов, метеостанции предоставляют только точечные данные.

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

Без этого или без кеширования вам просто не повезло.

...