1

現在、専用サーバーのサイトを実行していますが、将来的には Microsoft Azure クラウド プラットフォームを使用してスケールアップしたいと考えていますが、コードの特定の部分が Azure で動作するかどうかはわかりません。

このサイトは、各アイテムの画像を含むアイテムのギャラリーで構成されています。画像は sqlserver データベースに保存されます。

画像をディスクにキャッシュし、リクエストを画像にリダイレクトする http ハンドラーを作成しました (投稿の最後に示されているように)。

画像は、ASP.NET アプリケーション内の「imagecache」という仮想ディレクトリに保存されます。(つまり ~/imagecache/ )。

Web アプリは Azure プラットフォーム上の多くの仮想マシン インスタンスで実行されるため、インスタンス間でイメージを共有する必要がありますよね?

だから私の質問は本当に..私がすでに持っているものを実現する最良の方法は何ですか?

ありがとう

画像生成コード..

public class getimage : IHttpHandler {


    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    public void ProcessRequest (HttpContext context) {

        try
        {

            string uniqueid = "";

            if(context.Request.QueryString["id"]) uniqueid = context.Request.QueryString["id"].ToString();

            string dir = "~/imagecache/";
            string image_target_path = dir + "image-file-" + uniqueid + ".png";

            byte[] data = null;
            context.Response.ContentType = "image/png";

            if (!System.IO.File.Exists(context.Server.MapPath(image_target_path)))
            {
                if (context.Request.QueryString["id"] != null)
                {
                    // get image data from the database
                    data = ImageHelper.getDatabaseImageDataByID(Convert.ToInt32(uniqueid));

                    using (System.Drawing.Image img = System.Drawing.Image.FromStream(new System.IO.MemoryStream(data)))
                    {
                        // save image to disk in the virtual dir
                        img.Save(context.Server.MapPath(image_target_path));
                    }
                }
                else
                {
                    // set a sample image if no id is set
                    image_target_path = "~/images/noimage.png";
                }
            }

            // redirect request to image file
            context.Response.Redirect(image_target_path, false);

        }
        catch (Exception ex)
        {
            log.Error(ex.Message, ex);
        }
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}
4

2 に答える 2

5

ここでの簡単な答えは、イメージ ストアを SQL から Azure Storage Blob に移動することです。その後、これらの BLOB のコンテナーを公開し、URL 経由でアクセスできます。キャッシュ レイヤーの仲介者として行動する必要はありません。

ただし、アプリケーションが http ハンドラーを介してその仲介者として機能することを引き続き希望する場合は、1.3 SDK を使用してそれを実現できるはずです。このバージョンでは、Web ロール内で仮想ディレクトリと http ハンドラーを構成できる完全な IIS が導入されました。

しかし、パブリックに読み取り可能な BLOB コンテナーの使用を検討することを強くお勧めします。労力を大幅に削減して、同じレベルの機能を提供します。必要に応じて、これらの手法を組み合わせて、Azure AppFabric キャッシュを少しだけ追加して、柔軟性と機能を追加することもできます。

于 2011-02-02T13:38:07.657 に答える
1

ブレントが言ったように、Azure Storage BLOBは、特に世界中に約20のノードがあるコンテンツ配信ネットワークを有効にした場合に役立ちます。

インスタンスごとに個別のキャッシュディレクトリがあるため、ローカルディレクトリのキャッシュはローカルディレクトリだけでは機能しません。これが、多くの人がマルチインスタンスキャッシングのニーズにmemcachedを使用している理由です(David Aikenは最近、Azureでのこれの設定に関する記事を投稿しました)。

ブレントは、現在「プレビュー」モードになっているAzure AppFabric Cacheをほのめかしました(無料で試すことができますが、まだ本番環境の準備が整っていません)。これにより、インスタンス間(asp.netセッション状態でも)でデータを簡単にキャッシュできます。

Blobsとローカルキャッシュのどちらを選択しますか?memcachedやAppFabricキャッシュなどのキャッシュソリューションを使用すると、コンテンツにアクセスするユーザーをより細かく制御できるほか、ダウンロードされた合計バイト数を表すパフォーマンスカウンターをキャプチャすることができます。Blobsを使用すると、ロールインスタンスの多くの作業(ネットワーク、IIS処理とバイト変換、キャッシュのコーディングなど)が軽減され、ユーザーのブラウザーエクスペリエンスも高速化されます(ブラウザーは通常、特定のアドレスへの同時接続が2つだけになります。ブロブは技術的には別のURLにあります)。さらに、コンテンツ配信ネットワークを使用して、頻繁にアクセスされる画像のパフォーマンスを向上させることができます。

于 2011-02-02T16:07:07.770 に答える