如何通知客户端浏览器有关服务器上某些事件的信息?

4
我正在服务器端使用Python(Tornado),客户端使用一些JavaScript。我遇到了一个常见情况 - 一个用户向另一个用户发送消息。我希望服务器通知客户端浏览器(消息接收者)有新的消息。我该怎么做?我应该与客户端建立长连接(也许使用websocket),还是使用其他方法?
附注: 要通过websocket建立连接,我找到了一个好的库TornadIO 附注2: 由于项目负载较高,建立服务器与每个客户端之间的连接看起来有些可疑。我担心c10k问题。也许这只是我的知识不足。

1
请查看我的回答:https://dev59.com/FHA65IYBdhLWcg3wsg2A#3682211(以及同一问题下的其他回答)。 - NullUserException
这很好,但我对彗星有一个问题。我担心当10k用户连接后,没有人能连接(c10k问题)。 - Dmitry Belaventsev
2
如果你预计在一个聊天服务器上连接那么多用户,除了基础架构之外,你还会有很多其他问题需要担心。 - jwheron
1个回答

2
我在服务器端使用 Python(Tornado),在客户端使用一些 JavaScript。我有一个常见的情况——一个用户向另一个用户发送消息。我想让服务器通知客户端浏览器(收件人)有新消息。我该怎么做?我应该与客户端建立长连接(可能使用 WebSocket),还是其他什么方法?
使用像 Tornado 这样的实时 Web 服务器 - 是的。TornadIO 看起来是一个很好的解决方案,因为它将使用 socket.io,它对于旧版浏览器有回退选项。
C10k 问题的 维基百科条目 提供了已解决此问题的服务器列表:
一些Web服务器已经开发出来来解决C10K问题: - nginx,依赖于事件驱动(异步)架构,而不是线程来处理请求(WordPress.com使用nginx来解决C10K问题)[2]。 - Lighttpd,依赖于异步架构来处理请求[3]。 - Cherokee,一个轻量级的Web服务器[4]。 - Tornado,一个非阻塞的Web服务器和Web应用程序框架[5],使用Python编写。 - Apache Deft,运行在JVM上的异步、非阻塞Web服务器。 - JBoss Netty,一个NIO客户端服务器框架,可快速轻松地开发协议服务器和客户端[6]。 - Node.js,基于Google的V8 JavaScript引擎的异步、非阻塞Web服务器[7]。 - EventMachine,一个运行在Ruby EventMachine上的异步、非阻塞Web服务器。 - Yaws,一个用Erlang编写的Web服务器;受益于Erlang的极其轻量级进程。 - Medusa,一个用Python编写的非阻塞Web服务器库。
你会看到,Tornado被列出来了。
超出这个问题的范围,您的问题可能更多地涉及水平扩展而不是如何实现服务器到客户端的通知。
根据您选择的实时服务器解决方案,这可能永远不会成为问题。例如,单个Caplin System's Liberator实例可以实现超过10,000个持久连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接