关于在App Engine上提供图像的问题(2种替代方案)

时间:2010-01-25 12:03:04

标签: google-app-engine

计划推出一个漫画网站,提供漫画(图像)。 我几乎没有服务/缓存图像的经验。

所以这些是我正在考虑的两种方法:

1。使用LinkProperty

class Comic(db.Model)
  image_link = db.LinkProperty()
  timestamp = db.DateTimeProperty(auto_now=True)

优点: 图像是从磁盘空间本身获取的(磁盘空间很便宜,我拿它?) 我可以轻松地设置具有过期日期的app.yaml,以在用户的​​浏览器中缓存内容 我可以设置memcache来更快地检索实体(对于高流量)

2。使用BlobProperty

我使用了这个教程,它的工作非常整洁。 http://code.google.com/appengine/articles/images.html

附带问题:我可以说使用BlobProperty将我的图像从外部链接中“保护”吗?这意味着人们不能直接链接到连环画

我对方法2有一些担忧。

  • 我显然可以记忆这些实体以获得更快的读取速度。

但是:

  • 记忆图像是件好事吗?我的图像很大(每张图像100-200kb)。我认为memcache只允许最多4 GB的缓存数据?或者它是每个memcached实体1 Mb,具有无限的实体......

  • 如果appengine的memcache失败怎么办? - >解决方案:我必须返回数据存储区。

  • 如何在用户的浏览器中缓存这些图像?如果我在做方法没有。 1,我可以轻松地将我的app.yaml添加到内容的截止日期,并将图片缓存到用户端。

想听听你的想法。 我应该使用方法1还是2?方法1听起来简单明了,我应该警惕吗?

[EDITED] 如何解决这个困境?

困境:我要做的最后一件事就是阻止人们获取图像的直接链接并将其放在bit.ly上,因为用户将自动定向到我服务器上的图像 (如果用户从主页本身访问了广告/内容,则不是广告/内容)

3 个答案:

答案 0 :(得分:3)

您将使用大量带宽将所有这些图像从服务器传输到客户端(浏览器)。记住appengine有你可以上传的最大文件数,我认为它是1000但最近可能会有所增加。如果你想控制对文件的访问,我认为你不能使用选项#1。

选项#2很好,但如果你有很多内容,你的带宽和存储成本会很高。为了解决这个问题,人们通常会转向内容交付网络(CDN)。 Amazon S3和edgecast.com是两个支持基于令牌的访问URL的CDN。这意味着,您可以在您的appengine应用程序中生成一个对IP地址,时间,地理位置和其他一些条件有益的令牌,然后将带有此令牌的cdn url提供给请求者。 CDN为您的图像提供服务,并根据令牌进行访问检查。这将有助于您控制访问权限,但请记住,如果有遗嘱,有办法,您无法100%保护任何东西 - 但您可能会合理地接近。

因此,不是将内容存储在appengine中,而是将其存储在cdn上,并使用appengine创建带有指向cdn上内容的标记的URL。

以下是有关已签名网址的一些链接。我已经使用了这两个:

http://jets3t.s3.amazonaws.com/toolkit/code-samples.html#signed-urls

http://www.edgecast.com/edgecast_difference.htm - 查看“内容安全”

答案 1 :(得分:2)

在解决你的困境方面,我认为有几种选择:

  • 你可以导致图像 在Flash对象中呈现的 从您的服务器下载图像 以某种加密格式表示 它会知道如何解码。这个会 涉及相当多的前期工作。

  • 您可以拥有有效的一次性链接 对于图像。每一次你 生成了周围的网页, 图像的链接将是 随机生成,和 图像服务代码将无效 允许一次后的链接。如果你 有一个高流量的网站,这将是一个非常 资源密集型计划。

但是,你真的想要考虑强迫人们看广告需要做多少工作,特别是当他们中的很多人通过Firefox访问你的网站时,你几乎无能为力规避AdBlock。

在两种方法之间进行选择时,需要考虑几个方面。使用选项一,将图像存储为静态文件的位置,您只能通过执行 appcfg.py更新来添加新图像。由于AppEngine应用程序不允许您写入文件系统,因此您需要将新图像添加到开发代码中并进行代码部署。从站点管理的角度来看,这可能很难。此外,从memcache提供图像可能不会提供比将它们作为静态文件提供的改进性能。

将图像放入数据存储区的第二个选项确实可以保护您的图像仅在您有权使用或不通过逻辑控制逻辑时进行链接。您将遇到的问题是难以做出决定。请记住,HTTP是无状态的,因此找到一种方法来区分请求和应用程序外部的链接以及应用程序内部的链接将需要欺骗。

我个人的感觉是跳过篮球以确保人们看不到你的漫画看到广告正在以错误的方式解决这个问题。如果您要发布的内容值得保护,那么无论如何,人们都会涌向您的网站享受它。通过大量的流量,您可以弥补直接链接到您的图片的任何人,从而绕过一些广告服务。不要试图超越消费者。提供出色的内容,您将赚到很多钱。

答案 2 :(得分:0)

您的方法#1不实用:您需要为每个新漫画上传新版本的应用。

你的方法#2应该可以正常工作。它不会自动“保护”您的图像不被热链接 - 它们仍然像任何其他图像一样提供在URL上 - 但您可以在图像服务处理程序中编写您想要的任何代码,以尝试防止滥用。

第三个选项和#2的变体是使用new Blob API。您可以存储blob密钥,而不是将图像本身存储在数据存储区中,而图像处理程序只是指示blobstore基础结构要提供什么图像。