首先,这里是 我最初的问题催生了这一切.

我正在使用 Appcelerator Titanium 开发 iPhone 应用程序(最终也开发 Android 应用程序)。我使用 Titanium 直接连接到 CouchDB 的端口 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 数据。凉爽的。

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

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

有帮助吗?

解决方案

又是我。:-)

CouchDB 继承了其编写语言 Erlang 的超级并发处理能力。Erlang 使用轻量级进程以及这些进程之间的消息传递来在高并发负载下实现出色的性能。它还将利用所有 CPU 核心。

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

两者都应该可以轻松处理数以万计的连接,但我希望 CouchDB 能够比 Node 更好地处理并发性(并且您需要花费更少的精力)。请记住,如果将 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/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top