Gmail的新邮件通知是如何工作的?

13
我想知道Gmail如何实现每次收到邮件都会自动刷新邮件列表。似乎服务器向浏览器发送了某种事件,但这是怎么可能的呢?或者可能很简单:浏览器每隔2秒向服务器请求新邮件吗?但这可能会降低性能...
有人有什么想法吗?
编辑:好的,如果是简单的答案,他们如何管理性能?当我从另一个帐户发送电子邮件到Gmail帐户时,视图几乎立即“刷新”。你说的是一个简单的函数,返回true/false,但它必须有一些逻辑(数据库连接或读取某些文件)。他们如何处理它?
参见:GMail Chat如何在没有客户端交互的情况下进行AJAX请求?
4个回答

11

我不确定 Gmail 使用哪种技术,但其概念是通过反向 AJAX、Comet 或 Sprocket 等技术打开一个通道。

可以将其视为客户端请求服务器数据,但服务器仅在有新邮件时才会在一分钟后返回。使用这种技术,客户端几乎可以实时显示结果,而无需每 2 秒轮询。明白了吗?


这些技术大多使用轮询来“模拟”通道的存在。实际上,保持TCP连接以便服务器向客户端发送更新数据被称为“服务器推送”,它是1994年的热门新技术。 - chaos
1
“模拟”是目前浏览器能够做到的最好的。如果允许在客户端应用程序中打开端口并监听它们,则可以使用服务器推送技术。在浏览器上下文中,没有真正的服务器推送。我提到的方法提供了一种机制,使用可用的轮询技术来“模拟”它。这也是Facebook和其他即时通讯提供商在您的朋友在聊天框中输入内容时更新窗口的方式。 - Ryan Oberoi
那不是很正确,Ryan。虽然有服务器推送这种东西,但没有人使用它,因为它会在服务器上浪费大量资源。 - chaos

3

Gmail实际上在轮询服务器以获取更新。虽然不是每两秒钟一次,那样会很疯狂。使用Tamper Data进行测试后,看起来可能是每20秒钟一次,尽管似乎有多个事件经过,这使它有点混乱。

关于您的编辑,我想他们可能在其数据库中跟踪帐户的最后活动时间戳,客户端轮询查询通过Ajax检索该时间戳,并将其与其上次同步进行比较,以确定是否需要进行完全更新。


2

你的答案是正确的。谷歌邮件通过 AJAX 从服务器检查新邮件。


2

这似乎是一种每隔X秒获取信息的ajax监听器。

我已经为我的一个项目设置了类似的东西。我调用了一个返回 true 或 false 的函数,如果页面需要刷新则返回 true,否则返回 false。然后,如果有更新,你可以再次调用来获取实际的更新。这样,你不必每次都刷新所有内容...但是如果你有很多用户,这仍然会对服务器产生压力。

换句话说,就像chaos所说的那样,它正在轮询服务器。


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