読者です 読者をやめる 読者になる 読者になる

うな(。・ε・。)

Android, iOS, AppEngine まわりのめもめも

AppEngine らいぶらり書いてる

最近ちょっとライブラリ作るのに凝りだしてしまって、AppEngine/Java の commons ライブラリを書いている。

第一弾は Counter.

github.com

Datastore 上でカウンターを単純に実装すると、遅いし Write オペレーションで高くついてしまいます。 この問題には既に確立された回答があり、PullQueue に一旦情報を貯めておき、Cron Job で Datastore に実際の書き込みを行ないます。このような実装とすることで、速く、安いカウンターを実装する事が出来ます。

この実装をライブラリとして提供したものが Counter になります。

使い勝手としてはこんな感じです。

Counter.increment() で指定したキーに対するカウントを +1 することが出来ます。

Counter.increment("/photos/2343");

使う側はこれで以上です。TaskQueueaddAsync() を使っているので処理をブロックしません。コストも安いので経済的です。

最後に、Cron Job のハンドラーを実装し、実際に書き込みを行ないます。

実際に書き込みを行なう処理は CountWriter interface を実装します。

public class ViewCountWriter implements WriteCountPullTaskDelegate.CountWriter {
    @Override
    public void addCount(String key, int count) {
        // key に対するカウントを、count 分増やして書き込む処理を実装します
        final PageView pageView = PageViewRepository.getOrCreate(key);
        pageView.setViewCount(pageView.getViewCount() + count);
        PageViewRepository.put(pageView);
    }
}

この実装クラスを Cron Job ハンドラーにて WriteCountPullTaskDelegate.doWriteCount() に渡してやることで、処理を完遂出来ます。

// cron job のハンドラー
public void doGet(HttpServletRequest request, HttpServletResponse response) {
    WriteCountPullTaskDelegate.doWriteCount(new ViewCountWriter());
}

他には、次のような小さいライブラリも提供予定です。

  • Key ベースのキャッシュを自動で行なう DatastoreCallbacks
  • アクセスログではなく BigQuery に飛ばすロガー
  • リクエストとレスポンスの payload をログする ServletFilter
  • JOIN なクエリをいい具合に Memcache してくれる DatastoreCallbacks(これは書くか分からない)
  • Entity の変更に対するコールバックを一元的に書くための DatastoreCallbacks
  • Repository クラスの基本的なメソッドを提供するベースクラス
  • stats をメールで送ってくれる Cron Job(未定)

ほぼ自分用です。Java たのしい