2012-04-20 8 views
0

私は他のJavaアプリケーションで使用されている画像をAmazon S3で保存しています。最近、カテゴリ、タグなどの機能を導入するためにアプリを更新する必要がありました。今のところ、これはS3に保存されたJSON設定に基づいて解決されました。それらは他のアプリケーションによってフェッチされ、ある種のDB置換として使用されます:)。WebサービスはS3でホスティングをイメージしますか?

評価やユーザーのフィードバックなどのその他の改善はまだ行われています。したがって、いくつかのWebサービスでDB +バックエンドに移動することは、次の論理的なステップです。まず、私は追加のコストとメンテナンスの問題のためにEC2インスタンスのようなものを使用していません。

最小限の時間と労力でこれを実装する方法をいくつか推奨する必要があります。したがって、基本的な要件は次のとおりです。 - イメージはs3に格納されます - Webサービスはカテゴリリストを取得するメソッド、カテゴリ内のイメージのためのs3へのリンクリスト、いくつかのイメージレーティングを更新するメソッドを提供します。 。

私の考えは次のとおりです。 - すでにs3を使用しています。 - 上記のwebserviceを実行するためにJavaのホスティングを追加してください(私はEC2を使用する考え方が好きではありません。 - ハードウェアの大部分を得るには、 "普通の" javaeeまたはいくつかの軽いフレームワークを使用します。

私はまた、いくつかのイメージホスティングサービスを使用すると考えましたが、私は何かsimmilarを見つけられませんでした。または、画像ホスティングに使用できるいくつかのオープンソースのソリューションがあります。

これについてのご意見は、これがどのように実装されるべきかを決定しようとすると、私にはうんざりです。

ありがとうございます!

+1

私はあなたがDocument Management Sytemのように見えます。私は前にこれを使用しています。これはinbuilt APIを持っていて、ドキュメントやオープンソースでもデータを取得して検索します。 http:// www。alfresco.com/ – Phani

+0

ええ、私は野外施設について考えましたが、それは私にとっては過度のものになると思います。評価やタグ付きの画像を保存するには重すぎます。 – kodlan

+0

Solr用の「画像タグ付け」ラッパーはありますか? – kodlan

答えて

0

S3とJSONは、完全なリレーショナルデータベースシステムに行く手間を省くことができます。

ソリューションを想像すれば、S3のディレクトリにテーブルをマッピングし、S3の個々のファイルに行を付け、各行の列の値をそのファイルに格納されたJSON構造としてS3表現に変換できます。少量のデータを各「行」= S3ファイルに保存すると、データを簡単に更新できます。 S3への移行が成功するか完全に失敗すると、更新内容は一貫しています。

テーブルにある行の数を確認するには、S3リスト機能を使用して、そのテーブルの共通接頭辞付きのファイルを一覧表示します。

S3コンソールを使用すると、ファイル構造を表示して調べることができます。

セキュリティはAmazon IAMで提供されています。

自動バックアップは、ライフサイクルルールを使用してAmazon Glacierにコピーできます。

このアプローチを使用すると、EC2サーバーを実行したり、Amazon RDSを使用したりする追加の費用と複雑さを伴わずに、多くのリレーショナルのような機能が得られます。

最後に、以前の作業のツールを使用しているので、これをすべてプログラミングするのは簡単です。私はあなたがこのようなS3のすべての必要な操作を実行するためにパッケージを持っていると思う:

//---------------------------------------------------------------------  
    // Amazon S3 
    //---------------------------------------------------------------------  
     class S3 extends AmazonS3Client 
     {final String bucket; 
      S3(String u, String p, String Bucket) 
      {super(new BasicAWSCredentials(u, p)); 
      bucket = Bucket; 
      } 
      boolean put(String k, String v)  
      {try 
      {final ByteArrayInputStream b = new ByteArrayInputStream(v.toString().getBytes()); 
       putObject(bucket, k, b, new ObjectMetadata()); 
       setObjectAcl(bucket, k, CannedAccessControlList.PublicRead); // Has to be here to allow change to reduced redundancy 
       changeObjectStorageClass(bucket, k, StorageClass.ReducedRedundancy); 
       setObjectAcl(bucket, k, CannedAccessControlList.PublicRead); // Has to be repeated because it is now a new object again 
       return true; 
      } 
      catch(Exception e) {log("Cannot put "+bucket+"/"+k+" to S3 because "+e);} 
      return false; 
      } 
      String get(String k) 
      {try 
      {final S3Object f = getObject(bucket, k); 
       final BufferedInputStream i = new BufferedInputStream(f.getObjectContent()); 
       final StringBuilder s = new StringBuilder(); 
       final byte[]b = new byte[1024]; 
       for(int n = i.read(b); n != -1; n = i.read(b)) {s.append(new String(b, 0, n));} 
       return s.toString(); 
      } 
      catch(Exception e) {log("Cannot get "+bucket+"/"+k+" from S3 because "+e);} 
      return null; 
      } 
      String[]list(String d) 
      {try 
      {final ObjectListing l = listObjects(bucket, d); 
       final List<S3ObjectSummary> L = l.getObjectSummaries(); 
       final int n = L.size(); 
       final String[]s = new String[n]; 
       for(int i = 0; i < n; ++i) 
       {final S3ObjectSummary k = L.get(i); 
       s[i] = k.getKey(); 
       } 
       return s; 
      } 
      catch(Exception e) {log("Cannot list "+bucket+"/"+d+" on S3 because "+e);} 
      return new String[]{}; 
      } 
     } 
     } 
関連する問題