【问题标题】:Improve handling of slow external sources with ImageResizer RemoteReader使用 ImageResizer RemoteReader 改进对慢速外部源的处理
【发布时间】:2016-10-05 08:34:19
【问题描述】:

我们正在使用 ImageResizer 来处理来自某些客户网站的图像并调整其大小,这些图像会在它们到达最终用户的途中。在大多数情况下,这非常有效,我们很高兴。最近我们一直在努力解决的问题是,一些远程资源非常非常慢。这不是产品的问题,但我们希望得到一些关于如何更有效地使用它来处理这种情况的建议。

RemoteReader 插件有 15 秒的(硬编码)超时来读取远程图像。大多数时候,这已经足够了。如果成功获取图片,它会缓存在我们的 Web 服务器和 CDN 上,重复请求应该很快。但是如果请求超时,抛出的异常会返回 500,并且我们的 Web 服务器上没有任何内容(AFAIK)可以记住这一点。 CDN 应该将错误响应缓存一段时间,但通常重复请求会不断增加这些下载图像的尝试,这将继续超时。

更糟糕的是,最大的罪魁祸首是请求最终会成功,但我们看到下载(在任何绝对意义上)不是很大的图像需要几分钟的时间。显然,我们不想让用户等待那么久,但是如果我们可以将该图像放入本地缓存中,那么下游请求就会很好地工作。

我不确定在不分叉插件的情况下我们可以对任何这种行为施加多少控制。但是,如果我们缺少最佳实践,我很乐意解决这个问题。

有什么方法可以限制加载失败的远程图像的尝试?

有没有办法允许从远程源进行异步传输?

如果我们要尝试构建这样的东西,是否有任何 API 可以将内容注入 DiskCache?

【问题讨论】:

    标签: imageresizer


    【解决方案1】:

    有什么方法可以限制加载失败的远程图像的尝试?

    不在 ImageResizer 中,但有 IIS 中间件可以做到这一点(我认为)(这是一个通用的 HTTP 事情;如果 URL 超过速率限制 500,则阻止 URL)。

    有没有办法允许从远程源进行异步传输?

    我们提供异步 HttpModule,但我认为您的意思是后台传输?您可以通过安排一个 cron 任务或只是向服务器发出 HTTP 请求来获取和缓存图像源来做到这一点。

    如果我们要尝试构建这样的东西,是否有任何 API 可以将内容注入 DiskCache?

    你在使用 SourceDiskCache 吗?这会将原始图像缓存在磁盘缓存中。还有一个方便的基类用于构建自定义磁盘缓存。

    我不确定在不分叉插件的情况下我们可以对任何这种行为施加多少控制。但是,如果我们缺少最佳实践,我很乐意解决这个问题。

    不要害怕分叉。鉴于此时项目的稳定性,Git 使合并变得非常轻松。只需在有新版本发布时查看上游即可。

    【讨论】:

    • Re: 异步传输,我在想象一个系统,比如说,一个远程图像的请求进入,立即尝试超时,但是具有更长超时时间的重试排队等待“离线”。但这只有在我们能够将这些位放在缓存系统可以找到它们的位置时才有效。
    • 我们现在实际上没有使用SourceDiskCache。现在这是我要调查的首要任务。对超时情况没有帮助,但会在许多请求来自参数略有不同的相同远程图像的情况下有所帮助。
    • 您当然可以将失败的请求排队以进行离线处理,但您可能必须添加事件挂钩或其他东西。很可能需要更改代码。
    • 是的,第一件事似乎是向RemoteReader 添加一些机制以查看超时引发的异常。 (或者所有虚拟图像提供程序上的更通用机制?)将内容放入CustomDiskCache 的唯一方法似乎是实际向它请求一个丢失的东西……并且那里有足够的锁定和协调,我没有我想我想尝试重构该代码以添加这样的东西。 (但也许我可以定义某种特定于重试的虚拟映像提供程序,它生成相同的缓存键,并执行自己的 HTTP 请求?)
    • GetCachedFile() 方法使用 lambda 来写入文件(如果文件不存在)。以下是我们生成 keyBasis 的方式:github.com/imazen/resizer/blob/…
    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 2023-03-15
    • 2023-03-21
    • 1970-01-01
    • 2014-10-25
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多