2013-04-28 1 views
5

다음은 간단한 사용법입니다. user2는 user1의 문서를 응용 프로그램 내의 자신의 저장소에 복사하려고합니다. 간단해야한다, 그렇지? 우리가해야 할 일은 blobstore에 user2와 연결할 수있는 키가 리턴 된 두 번째 동일한 blob을 만드는 것뿐입니다. 우리는 여기서 뭔가를 놓치고 있어야합니다. 앱 엔진 얼룩 저장소의 기본 기능은 브라우저에서 업로드 및 다운로드 한 얼룩을 처리하는 것으로 나타 났으며 서버 측에서 시작된 간단한 복사 작업은 그리 간단하지 않습니다.Java의 앱 엔진에서 Blobstore 엔티티의 복사본을 만드는 가장 좋은 방법은 무엇입니까?

명백한 해결책은 Java에서 실험 파일 api를 사용하는 것처럼 보였지만 사랑은 없었습니다. MB 이상의 파일 크기가 될 때까지는 작동하지 않습니다. 예기치 않게 실패합니다. 서버 레이어에이 모든 내용을 읽어도 저장 영역에 복사본을 만들어야 할 때 어리석은 것처럼 보입니다. 또한 우리가 생산 환경에 실험적 기능을 도입 할 확률은 0이 아니지만 가볍습니다.

우리의 환경에 대한 몇 가지 정보 : 응용 프로그램은 Java로 작성되었으며 우리는 클라우드 저장소가 아닌 blobstore를 사용하고 있으며 지금은이를 위해 최선을 다하고 있습니다. 우리는 소규모 부서 팀으로 앱 엔진을 사용할 수있는 훌륭한 플랫폼이라고 주장하지만이 문제는 우리에게 어려움을 겪고 있습니다. S3는이 사실을 간단하게 보이게합니다. 우리는 정말 바보 같은 것을 놓치고 있습니까?

+1

얼룩을 수정할 수 없으므로 왜 복사본을 만들까요? user2에 동일한 blob에 대한 또 다른 참조가 있습니다.사용자가 BLOB의 내용을 삭제할 수 있다면 BLOBSTORE에서 실제로 삭제하기 전에 참조 카운터를 확인하십시오. –

+0

우리는 사용자가 삭제할 수 있기 때문에 그것에 대해 생각했지만 꽤 빨리 폐기되었습니다. 단일 한 얼룩의 우아함과 복사의 고통을 감안할 때, 이것은 또 다른 볼만한 가치가 있습니다. 이것을 모델링하는 가장 좋은 방법은 무엇입니까? blob에 둘 이상의 참조가 있는지 여부를 추적하는 상호 참조 엔터티 - blob이 '복사'될 때 상호 참조 엔터티에 항목을 만들고 '복사'또는 '삭제'될 때까지 카운터 또는 ID를 더하거나 뺍니다. 하나의 참조 만 있습니다. 우리는 카운터 및 데이터 저장소에 대한 어려움을 겪었으므로 실제로 마지막 참조 일 때 실제로 삭제하는 것은 약간 무서운 것입니다. – coleMan

+0

몇 가지 논쟁 끝에 Kalle의 제안을 변형하기로 결정했습니다. 다른 사람들에게 도움이 될 수 있도록 아래에서 답하십시오. 또한, 우리는 코드 구현 질문이 있다고 생각했지만 프로그래머 스택 교환에 더 적합한 아키텍처 문제로 밝혀졌습니다. – coleMan

답변

1

우리는 파일 api로 blob의 프로그램 복사본을 만들고 Kalle이 그의 의견에서 제안한 참조를 사용하여 사본과 원본에 대한 정보를 저장하는 새로운 외부 참조 엔티티를 작성한다는 아이디어를 폐기했습니다. 이미지 나 파일이 삭제 될 때 xfef 엔티티에서 참조를 확인하고 해당 이미지/파일을 가리키는 항목을 삭제합니다 (즉, 삭제 된 이미지/파일이 다른 이미지/파일에서 복사 된 경우). 외부 참조를 찾지 못하면 블롭 자체를 삭제합니다. 우리는 고아가 된 얼룩을 놓아 두는 개인 정보 보호/준수의 영향을 좋아하지 않으며 모든 $$$이 도움이됩니다. 우리는 청결한 집을 지킬 생각을 좋아했습니다.

0

해결책 1 : Google Compute Engine 인스턴스를 시작하고 gsutil 명령을 사용하여 사본을 만듭니다.

그리고 완료되면 인스턴스를 종료하십시오. 이것은 나의 지식에 복사를 할 수있는 가장 빠른 방법입니다

gsutil documentation

해결 방법 2 :하지만 의견에 말했듯이 당신이 말한 요점은 무서운 뜻이 때문에 나는 개인적으로 카운터를 사용하도록 선택합니다 사본에 동일한 문제가있다. 예를 들어 덜 무서울 것 같은 것들에 대해 강력한 단위 테스트를 사용하는 카운터를 사용하십시오.

덜 무서워하는 생각은 당신이 당신의 카운터에 0에 이르렀을 때 즉시 blob을 지우지 않고 나중에 할 일을하는 것입니다. Google App Engine에서 Scheduled task을 사용합니다. 그리고 한 달 후 예를 들어 파일과 실제 기록을 삭제하십시오.

0

댓글에서 이미 언급했듯이 하나의 얼룩을 유지하고 키를 전달하십시오. 그러나 정말로 삭제할 필요는 없습니다. 아카이브 목적으로 BLOB를 유지하는 것이 좋습니다. 그렇다면 delete은 실제로 어떻게 작동합니까? 데이터 스토어 모델에는 부울 삭제 필드가 있어야합니다. 삭제시 엔티티에서 blob 키를 제거하지 않습니다. 오히려 부울 필드를 true으로 표시합니다. 이렇게하면 제품에는 파일을 소유 한 모든 사용자의 기록이 있습니다. 그러나 사용자는 절대 알 필요가 없습니다.

관련 문제