4

类似于空间图像数据的平铺服务器,我想在基于 Django 的 Web 应用程序中查看许多动态生成的图像(合并图像、颜色更改等)。由于一个客户端可以轻松地在短时间内请求许多(>100)图像,因此很容易使 Web 服务器(Apache + mod_wsgi)停机。

因此,我正在寻找替代方法。由于我们已经使用了 Celery,因此异步执行此图像处理并将生成的数据推送到客户端可能是一个好主意。为此,我将 WSGI 服务器切换为 gevent,并将 Apache 用作代理。但是,我还没有设法让 push 工作,我不太确定这是否是正确的方向。基于此,我有三个问题:

  1. 你认为这(Celery、gevent、Socket.IO)是一种允许许多客户端使用应用程序而不会使 Web 服务器停机的明智方式吗?你看到替代品了吗?

  2. 如果我将图像处理交给 Celery 并让它在完成后将图像数据推送到浏览器,连接不会通过 Apache,对吗?

  3. 如果使用某种推送到客户端,最好为每个图像使用一个连接还是一个连接(完成后关闭它)?

背景:

我正在开发的 Django 应用程序允许用户显示非常大的图像。这是通过平铺之前的大图像并仅向用户显示网格中当前相关的图块来完成的。据我了解,这是在映射和空间图像数据(例如 OpenStreetMap)领域提供数据的标准方式。但与地图数据不同的是,Z 中还有许多切片可供用户滚动浏览(生物图像)。

当瓷砖被静态服务时,所有这些都可以正常工作。现在我添加了动态生成这些图块的选项——不同的图像被合并、颜色校正……。这可行,但对于 Web 服务器来说是一些繁重的负载,因为生成一张图像大约需要 0.1 秒。目前我们使用 Apache 和 mod_wsgi (WSGIRestrictedEmbedded On),很容易让服务器宕机。只需浏览图像堆栈就会导致 Web 服务器挂起。我已经尝试调整 MaxClients 等并关闭 KeepAlive。我还为 mod_wsgi 尝试了不同的线程/进程组合。但是,没有任何帮助足以允许多个用户使用。因此,我认为 Comet/WebSocket 方式可以在这里提供帮助。

4

3 回答 3

1

当瓷砖被静态服务时,所有这些都可以正常工作。现在我添加了动态生成这些图块的选项——不同的图像被合并、颜色校正……。这可行,但对于 Web 服务器来说是一些繁重的负载,因为生成一张图像大约需要 0.1 秒。

您需要一个负载均衡器,将图像请求发送到前端服务器(例如 NginX),该服务器将根据需要多路复用(并缓存!)尽可能多的请求,前提是您提供足够的后端服务器来完成繁重的工作。

这看起来像是 Amazon 分布式计算的经典案例:您可以将切片存储在 S3 存储中(或者 NFS over EBS)。所有图像处理服务器都从单个图像存储库中获取数据。

一开始,您可以在同一台机器上同时拥有 Web 应用程序和图像处理服务器的一个实例。但基本上你的过程是三个:

  • 计算图像 URL 的 Web 服务(您需要某种方式将操作编码为 URL 中的参数,否则您将不得不使用 cookie 和会话存储,这更麻烦)
  • 接收“图像公式”并提供 JPEG 图块的图像服务器
  • 允许访问大图像或单个原始图块的文件服务器

我曾在几个这样的架构中工作过,其中我们的图像层存储在一个图像文件中(例如,五个缩放级别,每个从 FIR 到 UV 的十五个通道,总共有 75 个“图像”,一侧最多 100K 像素,并且客户端可以请求“缩放级别 2,红色通道加上 UV-1 通道和绿色之间差异的两倍,从 X=157、Y=195 到 X=167、Y=205 的瓷砖”)。

于 2012-09-12T14:24:59.783 回答
0

我现在处于类似的情况,这就是我现在正在实施的方法。您是否考虑过将图像处理推给客户端?我看到您使用 PIL 来操作图像,但如果 PIL 命令不太涉及,您可以在 Javascript 中重新创建功能吗?使用画布可以做很多事情,在我的情况下,我能够在画布toDataURL上用 Javascript 生成所需的图像,以将其加载到所需的位置。

于 2013-05-23T18:19:50.807 回答
0

如果您只需要一个用户来关闭您的网络服务器,那么问题不在于 apache 或 mod_wsgi。

首先,您应该优化平铺程序并检查您是否真的只提供用户实际看到的数据。

在那之后,更快的 CPU、更多的内存、SSD 和积极的缓存将为您提供更高的性能。

最后,您可能会因使用另一个网络服务器而获得一些额外的分数,但不要期望太高。

于 2012-09-12T14:06:28.487 回答