« キャッシュシステムの Thundering Herd 問題 | メイン | DBI::Printf - A Yet Another Prepared Statement »

2007年09月27日

ウェブサービスのためのMutex - KeyedMutex

 昨日、以下のように書いたのですが、両者のうち2番目のアプローチを実現する Perl モジュール KeyedMutex を作成しました。

 サーバにおける Thundering Herd 問題は良く知られていると思いますが、類似の現象はキャッシュシステムでも発生することがあります。
(中略)
 対策としては、以下の2種類の手段があります。
  • バックエンドへの同一リクエストを束ねるような仕組みを実装する
  • エクスパイヤ以前の残存時間が一定以下となった段階で、キャッシュエントリのアップデートを開始する
 これらの手法には、それぞれメリットとデメリットがあり、アプリケーションによって最適な方法は異なります。
Kazuho@Cybozu Labs: キャッシュシステムの Thundering Herd 問題

 KeyedMutex は、クライアントが指定した鍵毎に排他処理を行うサーバ・クライアント型のシステムです。キャッシュへのデータ保存と連動させることで、データベースへの余分な問い合わせを抑制し、動作効率を高めることができます。以下のような感じで使用します。

# シェルからサーバを起動 (daemontools からの起動をお勧めします)
% keyedmutexd >/dev/null &
# perl のコード
use KeyedMutex;

my $km = KeyedMutex->new;
...
until ($value = $cache->get($key)) {
    if ($km->lock($key)) {
        # locked, read from DB
        $value = get_from_db($key);
        $cache->set($key, $value);
        $km->release;
        last;
    }
}

 ファイルベースでは無理っぽかったので、ソケットを使ったサーバ・クライアント型の実装にしました。ちなみにサーバは、パフォーマンスを考えながらC言語で書きましたので、興味のある方はご覧ください (ソースコード)。というか、サーバ書くの久しぶりだし Unix ドメインソケットを使うのは実は初めてだったりするので、ミスがありそうです。誰か添削してください。よろしくお願いいたします。

PS. インストールは通常の perl モジュールと同様 perl Makefile.PL && make all test && sudo make install でOKです。ちなみに一番開発で苦労したのは、Makefile.PL にどうやって C の実行ファイルと man ファイルを make & install させるか、というところでした (笑)

投稿者 kazuho : 2007年09月27日 15:46 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1552