如何始终如一地为来自同一CDN主机的资产提供服务?

如何始终如一地为来自同一CDN主机的资产提供服务?,cdn,assets,Cdn,Assets,因此,为了加快加载速度,我们正在设置一组CDN主机名来为来自的图像和资产提供服务。对于同一资产,一致使用同一主机的最佳方式是什么?例如,button.gif总是从中获得服务 我在考虑制定一些规则,其中文件名的md5散列以某种方式映射到服务器(不能使用文件名本身,因为很多都类似:“button home.gif”、“button about.gif”等等)。我不确定这是否是最有效的方法,但它似乎会起作用 有人有这方面的经验吗?我需要一个语言不可知的解决方案,因为这将由几种不同的语言使用 编辑:Ya

因此,为了加快加载速度,我们正在设置一组CDN主机名来为来自的图像和资产提供服务。对于同一资产,一致使用同一主机的最佳方式是什么?例如,button.gif总是从中获得服务

我在考虑制定一些规则,其中文件名的md5散列以某种方式映射到服务器(不能使用文件名本身,因为很多都类似:“button home.gif”、“button about.gif”等等)。我不确定这是否是最有效的方法,但它似乎会起作用

有人有这方面的经验吗?我需要一个语言不可知的解决方案,因为这将由几种不同的语言使用


编辑:Yahoo关于如何加快速度的解释:

内容交付网络(CDN)的重点是从离用户最近的服务器加载资产


从显式服务器加载给定资产违背了CDN的目的。我猜这是不被支持的。如果需要从显式位置加载资产,不要将其放在CDN上,而是放在中央服务器上。

当我这样做时,所有相关资源都有id号,所以我只是以此为基础。不过,扩展到非数字也不难

使用多少主机名是一个平衡点,因为主机查找开销太大,超过了多个主机名的优势,所以在外部,您可能会有大约12个主机名,可能更少

这本身就意味着一个简单的散列很可能很容易在给定的范围内分割,而不需要特别聪明

由于应用程序完全处理IURIs(在这种情况下,utf-8处理已经是您处理过的一个问题),或者没有处理,在这种情况下,路径的URI转义形式中的每个字符(也就是说,实际URI中使用的名称)都将在ASCII范围内

没有必要通过加密安全或类似的方式进行验证,因为猜测所使用的服务器不会带来安全风险。如果一个或两个页面稍微偏向一个服务器而不是另一个服务器,那就不会是世界末日(不管怎样,一个完美的has会出现随机性)

因此,只需遍历映像URI绝对路径中的字符(从第一个/以后主机的所有内容),将它们的整数值相加,然后使用主机名该部分的模

如果您想限制处理速度问题的字符数,请从末尾向后执行,因为这样会有最大的变化

“button home.gif”与“button about.gif”类似并不是一个问题,因为从这样一个过程的角度来看,它们实际上并不十分相似


如果您增加使用的主机名的数量,请尝试将其作为以前数量的倍数,因为这样会使保留旧URI的资源数量尽可能多。

也许我解释得不够好——它们都将从CDN提供服务,但我们有不同的资产主机名指向同一来源。我们试图在主机名之间分割资产以加快速度:这很好,但是在使用CDN时,仍然不应该指定来自哪些服务器资产。您应该依靠CDN正确地路由您的请求,以便在地理位置上以及通过跨多个服务器(使用不同的域名)进行负载平衡来最大限度地提高速度。这并不是要指定它们来自哪个源服务器。假设我在asset-origin.ourserver.com托管我的资产,并创建两个CDN主机名assets-1.ourserver.com和assets-2.ourserver.com。CDN端点都指向asset-origin.ourserver.com,但我希望在主机名之间分配请求,以便在浏览器中更好地加载时间。因此,button.gif应始终从assets-1.ourserver.com加载,logo.gif应始终从assets-2.ourserver.com加载。如果是这样,为什么不在标记中硬编码资产的域名?我们需要某种规则集来知道从哪个服务器获取它,而且,由于设置会因环境而异(例如,登台和本地开发人员不会使用多个主机名),因此我们需要一种以编程方式添加它的方法。此外,这需要在多个不同的应用程序中使用,因此在每个应用程序中手动设置资产主机名会很麻烦。我甚至没有想到对字符求和之类的事情——好主意:)有时候解决方案可能非常简单,以至于当你花了一整天处理复杂问题时,很难看到它们。@JonHanna我们有两个CDN服务器的3个别名。我使用一个字符串校验和,将mod除以6,得到应该从哪个服务器提供服务的资产。但如果有200项资产,它们就不会平均分为6个桶。我能做些更有效的事情来分配负载吗?小心那些yahoo.com的性能规则。关于电子标签的建议尤其不够理想,并且说服了单服务器系统(电子标签在这里从来没有问题)上的人们关闭它们。现在,确保它们正常工作是一个很好的观点(在你的案例中非常重要),但是这个建议是误导性的。就这一点而言,我怀疑您在这里所做的多主机名想法在未来将成为一个净损失,尽管在当前浏览器的默认设置下,这仍然是一个净胜利。