在金字塔中实施Facebook BigPipe系统

时间:2013-06-13 02:44:40

标签: python facebook pyramid

最近,我在Facebook上阅读了article关于他们的新页面流水线系统的信息。目前,有几个Github项目具有类似的实现,但它们都是用Php。

编写的

什么是BigPipe?

BigPipe是Facebook提出的一个系统,可以让网页加载更快。单个页面被分成小的小页面,所以看起来像这样,每个框都是一个小页面:enter image description here

因此,加载整个网页的逻辑变为:

  1. 首先向客户端请求服务器,生成的骨架html非常快,有大管javascript。
  2. 当客户端收到骨架HTML时,它会运行BigPipe javascript。
  3. 虽然与服务器的连接仍然持久,但“pagelets”会从管道中刷回客户端,并由bigpipe javascript呈现。
  4. 每个pagelet的HTML,CSS和JS都会在收到时下载并呈现,因此每个pagelet都会单独加载,从而加快了加载的速度。
  5. 他们的数据显示大约2倍的页面加载时间改善。

    问题

    在Pyramid中实现这个问题的主要问题是我没有找到一种方法来保持与客户端的持久HTTP连接,以便能够在管道中清除这些“pagelet”。我已经尝试了response.app_iter,但是生成器的产量没有被刷新,而是首先生成整个响应,然后立即刷新管道。有没有办法在与金字塔的持久连接中刷新多个“响应”?

1 个答案:

答案 0 :(得分:1)

从这里开始:https://webob.readthedocs.org/en/latest/differences.html?highlight=stream

  

这可以使CherryPy流响应主体输出目录。那里   直接没有等价物;您可以使用动态生成的迭代器   做类似的事情。

Pyramid使用webob库对请求和响应进行建模,从上面引用的文档开始。因此,我想说“标准”金字塔/挂架无法做到这一点。

相反,您将不得不使用不同的库来处理响应(可能还有请求)。这可能会为您提供有关如何执行此操作的一些建议:http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/designdefense.html

或者,您可以尝试子类化响应对象以添加该功能,可能通过委托来自另一个支持该功能的库中的代码。

您应该选择一个支持此功能的库,并在Pyramid邮件列表中询问如何最好地将其连接起来。