2013-04-28 5 views
5

ここでは簡単な使用例を示します。user2は、user1のドキュメントをアプリケーション内の自分のリポジトリにコピーします。シンプルにする必要がありますか?私たちが行う必要があるのは、blobstoreにuser2と関連付けることができるキーが返された2番目の同一のblobを作成することだけです。ここには何かが欠けているはずです。アプリエンジンブロブストアの主な機能は、ブラウザからアップロードされ、ブラウザにダウンロードされたブロブを処理することであり、サーバーサイドで開始された単純なコピー操作はあまり簡単ではないようです。Javaのアプリケーションエンジンでブロブストアエンティティのコピーを作成する最善の方法は何ですか?

明らかな解決策は、Javaの実験ファイルapiを使用していたようですが、愛はありません。 MB以上のファイルサイズで起きるまで、それはうまくいかず、予期せず失敗します。それをすべてサーバーレイヤーに読み込むことは、ストレージレイヤーにコピーを作成するだけでいいようです。さらに、私たちが実稼働環境に実験的機能を導入する可能性は薄いですが、ゼロではありません。

私たちの環境に関するいくつかの情報:アプリケーションはJavaで書かれており、クラウドストレージではなくblobstoreを使用しています。私たちは小規模な部署のチームで、アプリエンジンは使いやすいプラットフォームだと考えていますが、これは私たちには困惑しています。 S3はこれを驚くほど単純にしています。本当にここで馬鹿なことがありますか?

+1

ブロブは変更できないため、コピーを作成する理由は何ですか? user2の同じブロブへの別の参照があります。ユーザーがブロブの内容を削除することが許可されている場合は、ブロブストアから実際に削除する前に参照カウンタをチェックしてください。 –

+0

私たちはそれについて考えましたが、ユーザーが削除できるのでかなり早く廃止されました。単一の小滴の優雅さとコピーの苦労を考えると、これは別の見方をする価値があります。これをモデル化する最良の方法は何でしょうか? blobに複数の参照があるかどうかを追跡する相互参照エンティティ - BLOBが 'コピ​​ー'されたときに相互参照エンティティにエントリを作成し、 'コピー'または '削除'されるたびにカウンタまたはIDを加算/減算します。参照は1つしかありません。私たちはカウンターやデータストアで挑戦してきました。だから、実際に削除したのはちょっと残念です。 – coleMan

+0

いくつかの議論の末、私たちはKalleの提案の変種を使うことに決めました。それが他の人を助ける場合は、以下の回答をしてください。また、私たちは、コードの実装に関する質問があると思っていましたが、おそらくプログラマーのスタック交換に適したアーキテクチャー上の問題であることが判明しました。 – coleMan

答えて

1

私たちは、ファイルapiを使ってブロブのプログラマチックなコピーを作成し、彼のコメントで提案されたKalleのリファレンスに行き、コピーとオリジナルに関する情報を格納する新しいxrefエンティティを作成するという考えを破棄しました。画像やファイルが削除されると、xfefエンティティで参照が確認され、その画像/ファイルを指すものが削除されます(削除された画像/ファイルが別の画像/ファイルからコピーされた場合に作成されます)。すべての外部参照が見つからない場合は、ブロブ自体を削除します。私たちは、孤立したブロブを残しておくプライバシー/コンプライアンスへの影響が気に入らず、$$$ごとにストレージが安くても役立ちます。私たちはまた、きれいな家を話すようにするという考えが好きでした。

0

解決方法1:Google Compute Engineインスタンスを起動し、gsutilコマンドを使用してコピーを行います。

そして、終了したらインスタンスをシャットダウンします。これは、私の知識へのコピーを行うための最速の方法です

gsutil documentation

ソリューション2:しかし、コメントで言ったようにあなたが言ったポイントは怖い意志があるので、私は個人的には、カウンタを使用することを選択しますコピーと同じ問題になります。 したがって、たとえば、恐ろしくないものに対して、単体テストの強いカウンタを使用してください。

あなたがあなたのカウンターに0に達するとすぐにブロブを削除しないで、後でこれを行うための仕事をすることです。 Google App EngineでScheduled taskを使用します。例えば1か月後にファイルとその実際のレコードを削除します。

0

コメントで既に述べたように、1つのブロブを保ち、キーを回します。しかし、あなたは本当に削除する必要はありません。アーカイブの目的でBLOBを保持するのがよい方法です。では、どうすればdeleteが実際に動作するのですか?データストアモデルでは、ブール値削除フィールドがあります。エンティティからBLOBキーを削除しても削除されません。しかし、ブール値フィールドはtrueとマークします。この方法では、製品にファイルを所有しているすべてのユーザーのレコードが作成されます。しかし、ユーザーはこれまでに知る必要はありません。

関連する問題