Должен ли я напрямую подключаться к сокету CouchDB и передавать HTTP-запросы или использовать node.js в качестве прокси-сервера?

Во-первых, здесь мой оригинальный вопрос, который породил все это.

Я использую Appcelerator Titanium для разработки приложения для iPhone (в конечном итоге Android тоже). Я напрямую подключаюсь к порту CouchDB, используя Titanium объект Titanium.Network.TCPSocket. Я считаю, что он использует класс Apple SDK CFSocket/NSStream.

После подключения я просто пишу:

'GET /mydb/_changes?filter=app/myfilter&feed=continuous&gameid=4&heartbeat=30000 HTTP/1.1\r\n\r\n'

непосредственно в сокет. Он держит его открытым "навсегда" и возвращает данные JSON всякий раз, когда db обновляется и соответствует фильтру и запросу на изменение. Круто.

Мне интересно, нормально ли подключаться непосредственно к CouchDB-сокету, например, или мне лучше открыть сокет вместо node.js, и, возможно, используя этот CouchDB node.js module для обработки прокси CouchDB через node.js?

Моя главная проблема - это производительность. У меня просто недостаточно опыта работы с CouchDB, чтобы знать, удастся ли его сокет, а передача HTTP-запросов faux напрямую - хорошая практика или нет. Ищете опыт и мнения по любым последствиям или альтернативным предложениям.

Ответы

Ответ 1

Это я снова.: -)

CouchDB наследует супер concurrency обработку от Erlang, языка, на котором он был написан. Erlang использует легкие процессы и передачу сообщений между этими процессами для достижения отличной производительности при высокой одновременной нагрузке. Он также будет использовать все ядра процессора.

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

Оба должны легко обрабатывать десятки тысяч подключений, но я бы ожидал, что CouchDB обработает concurrency лучше (и с меньшими усилиями с вашей стороны), чем Node. И имейте в виду, что Node добавляет некоторую задержку, если вы положили ее перед CouchDB. Это может быть заметно только в том случае, если вы используете их на разных машинах.

Написание непосредственно в Couch через TCPSocket является-ok, пока вы пишете хорошо сформированный HTTP-запрос, следующий за спецификацией. (Вы не передаете запрос faux... что настоящий HTTP-запрос, который вы отправляете, как и любой другой.)

Примечание. HTTP 1.1 требует, чтобы вы включили заголовок узла в запросе, поэтому вам нужно будет исправить свой код, чтобы отразить это ИЛИ, просто используйте HTTP 1.0, который не требует от него упрощения. (Мне любопытно, почему вы не используете Titanium.Network.HTTPClient. Это только дает вам тело запроса после завершения запроса или что-то еще?)

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

EDIT: если вы используете Node, напишите фактический HTTP-прокси. Это будет работать намного быстрее, чем использовать предоставленный вами модуль и быть более простым в реализации. (Вместо того, чтобы определять свой собственный API, который затем делает запросы к Couch, вы можете просто передать определенные запросы на CouchDB и заблокировать другие, скажем, по соображениям безопасности.

Также посмотрите, как работает "многострочный": http://www.sitepen.com/blog/2010/07/14/multi-node-concurrent-nodejs-http-server/