ブロガーの実験室スポンサー広告
> AppEngineでsessionを有効にしていると遅くなる> ブロガーの実験室パソコンな日々
> AppEngineでsessionを有効にしていると遅くなる
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


--.--.--|スポンサー広告||TOP↑

[]AppEngineでsessionを有効にしていると遅くなる 23:18 AppEngineでsessionを有効にしていると遅くなる - あおうさ@日記 を含むブックマーク はてなブックマーク - AppEngineでsessionを有効にしていると遅くなる - あおうさ@日記 AppEngineでsessionを有効にしていると遅くなる - あおうさ@日記 のブックマークコメントAdd Startakeboruta

Google App Engineのsession情報はDatastoreを使っているため若干遅い。セッションを使わないアプリならセッションを無効にしておいた方が良 い。

appengine-web.xmlにて<sessions- enabled>false</sessions-enabled>する

※デフォルト(sessions-enabledの記述がない場合)ではセッションは無効になっている。


Datastoreを使うということはDatastoreTimeoutExceptionが発生する可能性があるということ。なので極力 切っておいたほうがいいようだ。

あと、jspは セッションがデフォルトでは有効になっているようなので無効にしておいた方がよい。

<%@page pageEncoding="UTF-8" session="false"%>

今日のエントリは全部twitterの情報メモ。

追記

いくつかtwitterでツッコミを頂けたのでjspのセッション無効 が意味があるのかをちょっと検証してみた。

検証内容としてはセッションを有効にしている場合にセッションをjspでset,getしていないにも関わらず Datastoreへのアクセスが発生するのかどうか。先に結論を言うとjspのセッションを無効にするのは意味がないと思う。

検証方法はmakeSyncCallをフックしてDatastoreへのアクセスが発生したらログを出力するようにする。AppEngine ではDatastoreやMemcacheなどサービスへのアクセスが発生した場合はmakeSyncCallというMethodが実行される仕組みに なっている。このmakeSyncCallはApiProxy.setDelegate()を使う事で実行する処理を変更できる。今回使用したソースは下 記。

import java.util.concurrent.Future;
import java.util.logging.Logger;

import com.google.apphosting.api.ApiProxy;
import com.google.apphosting.api.ApiProxy.ApiConfig;
import com.google.apphosting.api.ApiProxy.ApiProxyException;
import com.google.apphosting.api.ApiProxy.Delegate;
import com.google.apphosting.api.ApiProxy.Environment;
import com.google.apphosting.api.ApiProxy.LogRecord;

public class TestDelegate implements Delegate<Environment> {

    private static final Logger logger =
        Logger.getLogger(TestDelegate.class.getName());

    private static Delegate<Environment> originalDelegate = ApiProxy.getDelegate();

    public void setUp() throws Exception {
        logger.info("setUp");
        ApiProxy.setDelegate(this);
    }

    public byte[] makeSyncCall(Environment env, String service, String method,
            byte[] requestBuf) throws ApiProxyException {
        logger.info("makeSyncCall/" + service + "/" + method);
        return originalDelegate.makeSyncCall(env, service, method, requestBuf);
    }

    public Future<byte[]> makeAsyncCall(Environment env, String service,
            String method, byte[] requestBuf, ApiConfig config) {
        logger.info("makeAsyncCall/" + service + "/" + method);
        return originalDelegate.makeAsyncCall(
            env,
            service,
            method,
            requestBuf,
            config);
    }

    public void log(Environment env, LogRecord rec) {
        originalDelegate.log(env, rec);
    }
}

自分のアプリケーションのどこかでnew TestDelegate().setUp();を実行した後のサービスは必ず上記のクラスのmakeSyncCallを経由するようになる。jspには session="false"は記載しなかった。この仕組みで検証した結果次のようになった。

■appengine-web.xmlにて<sessions- enabled>true</sessions-enabled>

  • session変数にアクセスしなかった場合のリクエスト
  1. makeSyncCall/memcache/Get
  2. makeSyncCall/memcache/Set

※session変数にアクセスしなくてもmemcacheのアクセスが発生しているが、Datastoreへのアクセスは発生していない。

  • session変数にアクセスした場合のリクエスト
  1. makeSyncCall/memcache/Get
  2. makeSyncCall/datastore_v3/Put
  3. makeSyncCall/memcache/Set

※session変数にアクセスするとDatastoreへのアクセスが発生する。

また、appengine-web.xmlにて<sessions- enabled>false</sessions-enabled>の場合とsessions-enabledタグ自体をなくした場合 でも同様の実験をしたところセッションが無効な状態で、session変数にアクセスしなかった場合のリクエストはmemcacheへのアクセスも発生し なかった。この実験をするまでは、セッション変数を使っても使わなくてもとりあえずセッション変数は有効にしておけばいいかなと思っていたのだが、上記結 果の通りセッションを使わなくてもmemcacheへのアクセスが発生しコストがかかることがわかった。可能な限りセッションは使わない方が AppEngineではいいようだ。


そうそう、セッションを使う場合の注意点としてほかにもセッションはDatastoreに登録されるため定期的に削除する必要がある。 AppEngineでは下記URLを実行するとセッション情報を消してくれる便利な機能がある。

/_ah/sessioncleanup?clear

セッションを使う場合は下記のようにcron.xmlで60分毎に削除などの設定をしておいた方がいいだ ろう。

  <cron>
    <url>/_ah/sessioncleanup?clear</url>
    <description>Session cleanup every 60 minutes</description>
    <schedule>every 60 minutes</schedule>
  </cron>

あわせてweb.xmlにて下記のセキュリティ設定もしておいた方がいい。 セキュリティ設定をしていない場合は上記のURLを実行されて意図せずセッションを消される恐れがある。

    <security-constraint>
       <web-resource-collection>
           <url-pattern>/_ah/*</url-pattern>
       </web-resource-collection>
       <auth-constraint>
           <role-name>admin</role-name>
       </auth-constraint>
    </security-constraint>


2010.06.22|パソコンな日々コメント(0)TOP↑
名前:
コメントタイトル:
メールアドレス:
URL:
コメント:

パスワード:
管理人だけに表示:
管理者にだけ表示を許可
カテゴリー
最近の記事
最近のコメント
最近のトラックバック
ブログ検索
管理人のブログ一覧
管理人へメール

名前:
メール:
件名:
本文:

月別アーカイブ
プロフィール

やまもも実験室

Author:やまもも実験室
FC2ブログへようこそ!

RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。