我应该直接连接到CouchDB的套接字并传递HTTP请求或使用node.js作为代理?

首先,这是我最初提出的问题 。

我使用Appcelerator Titanium来开发iPhone应用程序(最终也是Android)。 我通过使用Titanium的Titanium.Network.TCPSocket对象直接连接到CouchDB的端口。 我相信它利用了Apple SDK的CFSocket / NSStream类。

一旦连接,我只写:

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

直接到sockets。 它保持打开“永远”,并返回JSON数据,每当数据库更新并匹配filter和更改请求。 凉。

我想知道,可以这样直接连接到CouchDB的套接字,或者我可以更好地打开node.js套接字,也可以使用这个CouchDB node.js模块来处理通过node.js的CouchDB代理?

我主要关心的是性能。 我只是没有足够的经验与CouchDB知道是否点击其套接字和直接传递虚假的HTTP请求是好的做法或不。 寻找有关任何后果或替代build议的经验和意见。

       

网上收集的解决方案 "我应该直接连接到CouchDB的套接字并传递HTTP请求或使用node.js作为代理?"

又是我。 🙂

CouchDBinheritance了Erlang语言的超级并发处理,Erlang使用轻量级进程和消息在这些进程之间传递,以在高并发负载下实现出色的性能。 它也将利用所有的CPU核心。

Nodejs运行一个进程,在这个进程中基本上只做一件事。 其基于事件的非阻塞IO方法确实允许它在等待IO块的同时进行多任务处理,但仍然只能一次处理一件事情。

两者都应该可以轻松处理数以万计的连接,但是我希望CouchDB能够比Node更好地处理并发(而且不需要太多的努力)。 请记住,如果将节点放在CouchDB之前,Node会增加一些延迟。 不过,如果你在不同的机器上安装它们,这可能只会引人注目。

只要您按照规范编写格式良好的HTTP请求,就可以通过TCPSocket直接写入Couch。 (你没有通过虚假的请求…这是一个真正的HTTP请求,你发送就像任何其他。

注意:HTTP 1.1确实需要你在请求中包含一个主机头,所以你需要纠正你的代码来反映这个或者只是使用HTTP 1.0而不需要它来保持简单。 (我很好奇你为什么不使用Titanium.Network.HTTPClient。请求完成后,它是否只给你请求主体?

无论如何,CouchDB可以完全处理直接连接,除非您花费很多精力到Node代理中,否则一旦您有100k人同时玩游戏,可能会给用户更好的体验。

编辑:如果你使用节点写一个实际的HTTP代理。 这将比使用你提供的模块运行快很多,并且实现起来更简单。 (而不是定义你自己的API,然后向沙发发出请求,你可以将某些请求传递给CouchDB,并阻止其他人,例如,出于安全原因。

另外看看“多节点”是如何工作的: http : //www.sitepen.com/blog/2010/07/14/multi-node-concurrent-nodejs-http-server/