2011-09-18 65 views
0

短任务描述:我希望一个登录用户能够发送即时短纯文本消息到另一个登录用户。就带宽和服务器负载(以及$$)而言,解决方案需要易于扩展且不需要太多的资源需求。如何即时通知登录用户的短消息

第一个想法是做客户端轮询,但这个想法很快就被放弃了,因为它没有满足可扩展性的要求。因此,在此之后,我开始研究并涉及了一些概念,包括套接字,node.js,xmpp。信息量有点令人沮丧,所以我希望有一些建议可以指引我走向正确的方向。希望有一些可用的托管解决方案。

@epascarello: 感谢您的快速响应。我做了,但没有详细说明。在深入研究任何技术之前,我想知道这实际上是我需要的。

大多数例子都会在即时聊天中进行说明,但我的要求有所不同。我不需要每个用户登录用户都可以看到一条消息,但只有一个特定用户,他们的意思是,可以有100 000个用户登录......

@Saeed Neamati: 谢谢!是的,我非常了解这两种客户端 - 服务器通信选项,并得出结论认为拉动是不行的。我现在想要找到的是最具扩展性的(这是主要的先决条件)和(希望)易于实现推送选项。例如,套接字选项相对容易,但由于服务器过载(或者我错了),似乎不能很好地扩展。 node.js(至少通过概念描述)应该更好,但是我想对这个假设得到一些确认。用xmpp - 我甚至不知道它与我的任务有多相关,以及如何处理它。

@andyuk: 安迪谢谢,是的socket.io也是我在研究过程中遇到的东西。据我了解,它需要一个服务器模块,需要在主机上运行。你知道如果可能在任何服务器上运行,或者我需要寻找一家专门的托管公司吗?由于某种原因,socket.io站点无法在我的PC上运行(IE或FF)。

回答

0

看,您只有两个客户端 - 服务器通信选项。客户端启动一个请求(网上的HTTP请求),这个请求被称为拉模型(就像客户端将请求拉出服务器一样),服务器对此作出响应,或者服务器直接启动响应而没有收到任何请求(网络上的HTTP响应),其被称为推送模式(如服务器将数据推送到客户端)。

你所描述的轮询实际上是拉模型,事实上它需要服务器的大量资源。

但另一方面,当你想使用推模式时,你的服务器应该知道客户端。换句话说,我们知道HTTP(基于TCP/IP)是一种无状态协议,这意味着在每次请求后,您的连接都会关闭,并且服务器会丢失您并忘记您的身份。

如果你想让服务器知道客户端,你应该保持连接打开。这通常通过一些HTTP标头完成,如Keep-Alive连接

但要做到这一点,您应该阅读Comet Programming。然而,这会降低您的可扩展性,因为在连接和客户端之间建立一对一的映射关系时会保持更多的连接(为了更好地理解这一点,您可以将连接视为服务器的门,您占用门的次数越多客户,其他客户就可以使用它)。

0

结帐socket.io。如果浏览器不支持网络套接字,它将回退到下一个最佳传输技术。

源代码中甚至有一个chat example included

至于您对可扩展性的关注,node.js对于此事非常完美,因为它是事件驱动的非阻塞特性。处理许多开放连接是Node的真正优势之一。

Plurk uses Node.js他们的实时聊天功能,他们支持100k +用户。

相关问题