2013-07-18 4 views
2

В настоящее время мы работаем над асинхронным REST API с приоритетом производительности.uWSGI & gevent Постоянное подключение сетевого сокета

Первоначально мы хотели развернуть узел Node.js из-за его архитектуры, управляемой событиями, которая хорошо подходит для использования, но, к сожалению, JavaScript пока не поддерживает сокеты SCTP.

Это приводит нас к Python, и после некоторых соображений мы решили пойти с uWSGI & gevent.

Однако из-за характера архитектуры существуют две области со значительными накладными расходами.

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

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

В идеальном случае мы хотели бы установить соединение сокета навсегда и продолжать использовать его для каждого запроса. В PHP это возможно при наличии постоянных соединений сокетов. Предлагает ли Python/uWSGI аналогичную функцию? В качестве альтернативы мы могли бы использовать структуру обслуживания uWSGI и запросы процесса в связках.

Любые советы приветствуются.

+0

Что значит «gevent» не управляется событиями? :) Не могли бы вы еще раз пояснить порядок сущностей в вашем дизайне? Что-то вроде Internet -> load balancer -> uWSIG/gevent/Python application -> ??? –

+0

У меня были некоторые серьезные неправильные представления о gevent, основанные на полностью отсталых мелких деталях. Кажется, я все понял. Это действительно клиент -> балансировка нагрузки -> uwsgi/gevent. – awishformore

ответ

0

Как только вы включите режим gevent, uWSGI стал чисто (и чисто означает отсутствие необходимости в пути для обезьян), управляемый событиями (иначе было бы невозможно использовать gevent). GEvent означает событийный + greenlet (избегает писать обратный вызов ад коды, основанные, как в node.js)

Подробнее о магии здесь: http://uwsgi-docs.readthedocs.org/en/latest/Async.html

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

+0

Я думаю, что я просто полностью запаздывал, но только для того, чтобы уточнить, получил ли я это прямо сейчас: Каждый раз, когда uwsgi получает запрос, он направит его в приложение через функцию ввода - обычно приложение (среда, ответ). Все, что нам нужно настроить при запуске сервера, просто переходит в код вне определений функций, который запускается при загрузке файла. Верный? – awishformore

+0

Последнее уже довольно конкретный вопрос, вам нужно показать код для этого. –