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

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

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

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

'GET / mydb / _changes? Filter = app / myfilter & feed = непрерывный & gameid = 4 & heartbeat = 30000 HTTP / 1.1 \ r \ n \ r \ n '

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

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

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

14
задан Community 23 May 2017 в 11:53
поделиться

1 ответ

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Если вы используете Node, напишите настоящий HTTP-прокси. Это будет работать намного быстрее, чем при использовании предоставленного вами модуля, и его будет проще реализовать. (Вместо того, чтобы определять свой собственный API, который затем отправляет запросы к Couch, вы можете просто передавать определенные запросы в CouchDB и блокировать другие, скажем, из соображений безопасности.

Также взгляните на то, как работает «многоузловой»: http://www.sitepen.com/blog/2010/07/14/multi-node-concurrent-nodejs-http-server/

13
ответ дан 1 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: