如何制作类似Facebook的实时通知?

5

我正在尝试制作类似于Facebook的实时通知。学习和搜索了很多后,我非常困惑,请解释一下什么是正确的,什么是错误的。


请确保该网站的用户数量可能与Facebook相同

  • 我们可以使用长轮询来进行实时通知吗?如果可以,有什么优点,缺点和限制。
  • 我们可以使用Websockets来进行实时通知吗?请注意用户数量可能与Facebook相同。如果是,有什么优点、缺点和限制。
  • 如果有其他方法,请解释。

困惑

根据我在网上了解到的,Websocket 是好的,但连接数存在限制(最大 5K),这意味着同时在线用户的最大数量只有 5K,这比 Facebook 的用户数量要少得多。如果我错了,请解释。

1个回答

13

你错了,基于Websocket的解决方案不会限制在5K并发连接。

根据Facebook新闻室的数据显示,他们在2013年9月平均每天有约7.27亿活跃用户,或者每分钟有大约504k个独立用户访问Facebook页面。假设平均访问时间为18分钟(由statisticbrain.com研究),他们的通知基础设施必须能够24/7提供约900万(18*504k)个并发TCP连接。虽然这个数字只是一个非常大致的近似值,但它可以让我们了解他们正在处理什么以及如果您要构建这样的系统,则必须处理什么。

您可以使用长轮询和Websockets来构建实时通知系统。在两种情况下,您都面临着与您的操作系统相关的类似问题(解释适用于基于Unix的系统):

  • 端口限制,一个TCP监听器套接字只能接受2^16个相同IP /端口上的连接,因此您需要侦听多个端口和/或多个IP地址。
  • 内存,每个打开的连接都使用至少一个文件描述符。

了解更多关于限制的信息,请参见在现代Linux盒子上可以拥有的最大开放TCP连接数是多少

长轮询vs.Websockets:

您长轮询解决方案中的每个轮询都需要一个新的HTTP请求,这需要比保持Websocket连接活动所需的带宽更多。此外,通知将作为HTTP响应返回,从而导致新的轮询请求。尽管Websocket解决方案在带宽和系统资源消耗方面可能更有效率,但它有一个主要缺点:缺乏浏览器支持

根据手头的统计数据,只使用WebSocket的解决方案会忽略约20-40%的访问者 (来自statscounter.com的数据)。为此,开发了不同的服务器库,将“连接”的概念从“物理”的底层传输模型中抽象出来。因此,更现代的浏览器使用WebSocket创建连接,而旧的浏览器则退而采用另一种传输方式,例如HTTP长轮询、jsonp轮询或flash。这些库的著名例子包括Sock.jsSocket.io


有许多公司可以解决应用程序实时通道扩展的问题,例如PusherPubNub,以及我们自己的Tambur - Andre

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