14

首先,这是我最初的问题,它产生了所有这些

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

连接后,我只需编写:

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

直接连接到插座。它保持它“永远”打开,并在数据库更新并匹配过滤器和更改请求时返回 JSON 数据。凉爽的。

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

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

4

1 回答 1

13

又是我。:-)

CouchDB 从编写它的语言 Erlang 继承了超级并发处理。Erlang 使用轻量级进程和这些进程之间的消息传递来实现高并发负载下的出色性能。它也将利用所有 cpu 内核。

Nodejs 运行一个进程,并且基本上在该进程中一次只做一件事。它基于事件的非阻塞 IO 方法确实允许它在等待 IO 块时执行多任务,但它仍然一次只做一件事。

两者都应该可以轻松处理数万个连接,但我希望 CouchDB 能够比 Node.js 更好地处理并发(并且您的工作量更少)。请记住,如果将 Node 放在 CouchDB 前面,它会增加一些延迟。不过,这可能只有在您将它们放在不同的机器上时才会引人注目。

只要您编写遵循规范的格式良好的 HTTP 请求,通过 TCPSocket 直接写入 Couch 就可以了。(您没有传递虚假请求……这是您发送的真实 HTTP 请求,就像其他任何请求一样。)

注意:HTTP 1.1 确实要求您在请求中包含 Host 标头,因此您需要更正代码以反映这一点,或者只使用 HTTP 1.0,它不需要它来保持简单。(我很好奇你为什么不使用 Titanium.Network.HTTPClient。它只是在请求完成后才给你请求正文吗?)

无论如何,CouchDB 可以完全处理直接连接并且——除非你在 Node 代理上投入大量精力——当你让 10 万用户同时玩游戏时,它可能会给用户带来更好的体验。

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

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

于 2010-09-01T17:26:02.033 回答