2010-09-01 7 views
14

Primero, aquí está my original question that spawned all of this.¿Debo conectarme directamente con el socket de CouchDB y pasar las solicitudes HTTP o usar node.js como un proxy?

Estoy usando Appcelerator Titanium para desarrollar una aplicación para iPhone (eventualmente Android también). Me estoy conectando al puerto de CouchDB directamente usando el Titanium.Network.TCPSocket object de Titanium. I crea utiliza la clase CFSocket/NSStream de Apple SDK.

Una vez conectado, simplemente escribo:

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

directamente a la toma de corriente. Lo mantiene abierto "para siempre" y devuelve datos JSON siempre que se actualiza el archivo db y coincide con el filtro y la solicitud de cambio. Guay.

Me pregunto, ¿está bien conectarse directamente al socket de CouchDB así, o sería mejor abrir el socket a node.js en su lugar, y tal vez usar este CouchDB node.js module para manejar el proxy CouchDB a través de node.js ?

Mi principal preocupación es el rendimiento. Simplemente no tengo suficiente experiencia con CouchDB para saber si golpear su socket y pasar solicitudes HTTP falsas directamente es una buena práctica o no. Buscando experiencia y opiniones sobre cualquier ramificación o sugerencia alternativa.

Respuesta

13

Soy yo de nuevo. :-)

CouchDB hereda el manejo súper concurrente de Erlang, el lenguaje en el que se escribió. Erlang utiliza procesos ligeros y pasa mensajes entre esos procesos para lograr un rendimiento excelente con una alta carga simultánea. Aprovechará todos los núcleos de la CPU, también.

Nodejs ejecuta un único proceso y, básicamente, solo hace una cosa a la vez dentro de ese proceso. Su enfoque IO no bloqueante basado en eventos le permite realizar múltiples tareas mientras espera trozos de IO, pero aún así solo hace una cosa a la vez.

Ambos deberían manejar fácilmente decenas de miles de conexiones, pero esperaría que CouchDB manejara mejor la concurrencia (y con menos esfuerzo de su parte) que Node. Y tenga en cuenta que Node agrega algo de latencia si lo coloca frente a CouchDB. Sin embargo, eso solo puede notarse si los tienes en máquinas diferentes.

Escribir directamente en Couch a través de TCPSocket es aceptable, siempre y cuando se escriba una solicitud HTTP bien formada que siga la especificación. (No está pasando una solicitud falsa ... es una solicitud HTTP real que está enviando como cualquier otra).

Nota: HTTP 1.1 requiere que incluya un encabezado Host en la solicitud, por lo que ' Necesitaré corregir tu código para reflejar eso O simplemente usar HTTP 1.0 que no lo requiera para mantener las cosas simples. (Tengo curiosidad por saber por qué no está utilizando Titanium.Network.HTTPClient. ¿Solo le proporciona el cuerpo de solicitud después de que finaliza la solicitud o algo así?)

De todos modos, CouchDB puede manejar totalmente las conexiones directas y - a menos que ponga mucho esfuerzo en su proxy Node - probablemente le dará a los usuarios una mejor experiencia cuando tenga 100k de ellos jugando el juego a la vez.

EDITAR: Si usa Node, escriba un proxy HTTP real. Eso funcionará mucho más rápido que usar el módulo que proporcionó y será más fácil de implementar. (En lugar de definir su propia API que luego realiza solicitudes a Couch, puede pasar ciertas solicitudes a CouchDB y bloquear otras, por ejemplo, por razones de seguridad.

también echar un vistazo a la forma "de varios nodos" funciona: http://www.sitepen.com/blog/2010/07/14/multi-node-concurrent-nodejs-http-server/

+1

fresca, estamos en la misma página, gracias de nuevo, lo bueno! Intenté usar Titanium.Network.HTTPClient primero, pero no tuve suerte en mantenerlo vivo. Creo que usa NSUrlConnection de Apple, que tiene un buffering inmutable. Puedo jugar con eso un poco más solo para asegurarme de que no sea una solución. – k00k

Cuestiones relacionadas