2010-01-25 1 views
3

코믹 스트립 (이미지)을 제공하는 만화 사이트를 시작할 계획입니다. 이미지 제공/캐싱에 대한 사전 경험이 거의 없습니다. App Engine에서 이미지 게재에 대한 질문 (2 대안)

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

장점을 LinkProperty를 사용

1 :

그래서이 제 2 개 전 고려 중이 야 방법이 있습니다 이미지는 GET-ED 디스크 공간 자체 (및 디스크 공간에서이 저렴 나는 받아들 일까?) 사용자의 브라우저에서 콘텐츠를 캐시하기 위해 만기일을 가진 app.yaml을 쉽게 설정할 수있다. 엔티티를 빨리 검색하기 위해 memcache를 설정할 수있다. (트래픽이 많은 경우)

2. BlobProperty 사용하기

이 튜토리얼을 사용 했으므로 꽤 깔끔했습니다. http://code.google.com/appengine/articles/images.html

사이드 질문 : 외부 연결에서 내 이미지를 "보호"하는 BlobProperty를 사용한다고 말할 수 있습니까? 그 사람들이 바로 연재 만화

나는 방법 2. 내가 분명히에 대한 memcache에 이들 엔티티 빨리 읽고 있습니다

  • 에 대한 몇 가지 걱정이 직접 연결할 수 없음을 의미합니다.

그런데 :

  • 이미지에게 좋은 일을 memcaching 있습니까? 내 이미지가 큽니다 (이미지 당 100-200kb). memcache는 최대 4GB의 캐시 된 데이터 만 허용한다고 생각하십니까? 또는 무제한 엔터티가있는 memcached 엔터티 당 1MB입니다 ...

  • appengine의 memcache가 실패하면 어떻게됩니까? -> 솔루션 : 데이터 저장소로 돌아 가야합니다.

  • 어떻게 이러한 이미지를 사용자의 브라우저에 저장합니까? 내가 방법을 안하면. 1, 내 app.yaml에 콘텐츠의 만료일을 쉽게 추가 할 수 있으며 사진은 사용자 측에서 캐시됩니다.

귀하의 생각을 듣고 싶습니다. 방법 1 또는 2를 사용해야합니까? 방법 1은 죽은 것처럼 간단하고 직선적인데, 내가 조심해야 하나?

[편집] 어떻게 이런 딜레마를 해결할 수 있습니까?

딜레마 : 내가하고 싶은 마지막 일은 사람들이 이미지에 대한 직접 링크를 얻지 않고 비트를 올려 놓지 못하게하는 것입니다.사용자가 내 서버의 이미지에만 자동으로 연결되기 때문에 (사용자가 메인 페이지에서 액세스 한 경우 주변의 광고/콘텐츠가 아님)

답변

2

귀하의 딜레마를 해결하는 측면에서 보면

  • 당신이 그것을 어떻게 알 것 하는 이미지가 암호화 된 형식의 어떤 종류의 서버 에서 이미지를 다운로드 할 플래시 객체 렌더링 을 원인이 될 수있다 : 대안의 몇이 있음 해독 할. 이것은 꽤 많은 사전 작업을 포함합니다.

  • 이미지에는 번 유효 링크가있을 수 있습니다.주변 웹 페이지가 생성 될 때마다 이미지 링크는 이 무작위로 생성되고 이미지 제공 코드는 한 번 허용 한 후 링크를 무효화합니다. 트래픽이 많은 웹 사이트가있는 경우 이는 매우 리소스 집약적 인 구성입니다.

정말,하지만 당신은 그들 중 생긴 숫자가 파이어 폭스를 통해 귀하의 사이트에 올 것 특히, 광고를 보는 사람들을 강제로 가치가 얼마나 많은 일을하는 것이 좋습니다, 아무것도 거의 없다 그 AdBlock을 우회 할 수 있습니다.

두 가지 방법 중 하나를 선택하는 관점에서 생각할 몇 가지가 있습니다. 옵션 1을 사용하여 이미지를 정적 파일로 저장하는 경우 appcfg.py 업데이트을 수행하면 새 이미지를 추가 할 수 있습니다. AppEngine 응용 프로그램은 파일 시스템에 쓸 수 없으므로 개발 코드에 새 이미지를 추가하고 코드 배포를 수행해야합니다. 이는 사이트 관리 관점에서 보면 어려울 수 있습니다. 또한 memcache 형식의 이미지를 제공하면 정적 파일로 제공하는 것보다 개선 된 성능을 제공하지 못할 수도 있습니다.

데이터 저장소에 이미지를 넣는 두 번째 옵션은 이미지가 제공되는 경우 논리를 통해 제어 할 수있는 권한이있는 범위에서만 이미지가 연결되지 않도록 보호합니다. 마주 치게 될 문제는 그 결정을 내리는 것이 어렵다는 것입니다. HTTP는 상태 비 저장이므로 애플리케이션 외부의 링크와 애플리케이션 내부의 요청을 구별하는 방법을 찾는 것은 속임수가 필요합니다.

내 개인적인 감정은 사람들이 광고를 보면서 만화를 볼 수 없도록 농구를 뛰어 넘으면 광고가 잘못된 방식으로 문제를 해결한다는 것입니다. 게시하는 콘텐츠가 보호받을만한 가치가있는 경우 사람들은 웹 사이트로 이동하여 어쨌든 즐길 수 있습니다. 많은 양의 트래픽을 통해 이미지에 직접 연결된 사람을 보충 할 수있을뿐 아니라 광고 서비스를 피할 수 있습니다. 소비자보다 현명하지 못하게하십시오. 뛰어난 콘텐츠를 제공하면 많은 돈을 벌 수 있습니다.

3

이러한 모든 이미지를 서버에서 클라이언트 (브라우저)로 전송하려면 많은 대역폭을 사용해야합니다. appengine에는 업로드 할 수있는 최대 파일 수가 있습니다. 1000으로 생각되지만 최근에 증가했을 수 있습니다. 그리고 파일에 대한 액세스를 제어하려는 경우 옵션 # 1을 사용할 수 없다고 생각합니다.

옵션 # 2는 좋지만 콘텐츠가 많으면 대역폭과 스토리지 비용이 높을 것입니다. 이 문제를 해결하기 위해 사람들은 일반적으로 CDN (Content Delivery Networks)을 사용합니다. Amazon S3 및 edgecast.com은 토큰 기반 액세스 URL을 지원하는 두 가지 CDN입니다.즉, appengine 앱에 IP 주소, 시간, 지역 및 기타 기준에 적합한 토큰을 생성 한 다음이 토큰을 요청자에게 제공하는 cdn url을 제공 할 수 있습니다. CDN은 이미지를 제공하고 토큰을 기반으로 액세스 검사를 수행합니다. 이렇게하면 액세스를 제어하는 ​​데 도움이되지만 유언장이있는 경우 기억할 수있는 방법이 있으며 100 % 보안을 설정할 수는 없지만 거의 합리적으로 접근 할 수는 있습니다.

콘텐츠를 appengine에 저장하는 대신 cdn에 저장하고 appengine을 사용하여 cdn의 콘텐츠를 가리키는 토큰이있는 URL을 만듭니다.

다음은 서명 된 URL에 대한 링크입니다. 나는이 두 가지를 사용했습니다 :

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

http://www.edgecast.com/edgecast_difference.htm - '콘텐츠 보안'을보고

+0

인터넷 대역폭에 문제가 없습니다. 인터넷 대역폭 비용이 많이 들기 전에 데이터 저장소 데이터 전송 할당량이 부족하게됩니다. – JasonSmith

+0

CDN은 물건을 더 저렴하게 만들지는 않지만 더 빠르고 값이 비싸게 만듭니다. @jhs : 데이터 저장소 전송 할당량이 부족하지 않습니다. 필요한 경우 할당량을 늘립니다. –

+0

닉, 상황에 따라 다릅니다. AppEngine은 약 $ 0.12/GB이지만 일부 공급 업체와 협상 할 수 있음을 알았습니다. 또한 데이터 저장소 및 관련 할당량을 사용하여 CDn에 저장할 수 있고 데이터 저장소 공간 및 API 할당량을 사용할 수없는 경우 정적 이미지의 얼룩을 저장하는 이유는 무엇입니까? 돈, 개발 시간 및 페이지 대기 시간면에서 실제로 저에게 더 적은 비용이 드는 것으로 밝혀졌습니다. – dar

0

귀하의 방법 # 1 실용적되지 않습니다 : 당신은 당신의 응용 프로그램의 새 버전을 업로드해야 것 각각의 새로운 연재 만화.

# 2 방법은 정상적으로 작동합니다. 이미지가 핫 링크되지 않도록 자동으로 "보호"하지 않습니다. 이미지는 여전히 다른 이미지와 마찬가지로 URL에 저장되지만, 이미지 제공 서비스 핸들러에서 원하는 모든 코드를 작성하여 악용을 방지 할 수 있습니다.

세 번째 옵션과 # 2 변형은 new Blob API을 사용하는 것입니다. 이미지 자체를 데이터 저장소에 저장하는 대신 BLOB 키를 저장할 수 있으며 이미지 핸들러는 BLOB 저장소 인프라에 어떤 이미지를 제공 할지를 지시합니다.

관련 문제