AppEngine らいぶらり書いてる
最近ちょっとライブラリ作るのに凝りだしてしまって、AppEngine/Java の commons ライブラリを書いている。
第一弾は Counter.
Datastore 上でカウンターを単純に実装すると、遅いし Write オペレーションで高くついてしまいます。 この問題には既に確立された回答があり、PullQueue に一旦情報を貯めておき、Cron Job で Datastore に実際の書き込みを行ないます。このような実装とすることで、速く、安いカウンターを実装する事が出来ます。
この実装をライブラリとして提供したものが Counter になります。
使い勝手としてはこんな感じです。
Counter.increment()
で指定したキーに対するカウントを +1 することが出来ます。
Counter.increment("/photos/2343");
使う側はこれで以上です。TaskQueue
の addAsync()
を使っているので処理をブロックしません。コストも安いので経済的です。
最後に、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 たのしい