unix domain socketでファイル記述子をやりとりするソケットプーリングを書いてみた

unix domain socket経由でプロセス間でファイル記述子のやりとりができるので、コネクションをプーリングして、unix domain socket経由で別プロセスに貸し出すスクリプトを試しに書いてみました。

poold.pl は起動すると 127.0.0.1:11211 へのコネクションを 3 つ作って保持し、unix domain socketをlistenしてクライアントからの貸し出し要求を待ちます。

ちなみに、unix domain socket は名前付きのではなく、abstract namespace のを作っています。これの利点は、パスに依存しないので、chroot内のプロセスと外のプロセスがやりとりできる点です。

client.pl は起動すると、unix domain socket 経由でソケットを獲得して、使い終わったらまたunix domain socket経由でプーリングプロセスに返却します。

  • 利点
    • ファイル記述子を貸し出してあとの通信には関与しないので、通信量が多いほど、proxy型のプーリング機構より早いと思います。ロードバランサに例えるなら、L7のproxy型とL4のDSRの違いのようなものです。
  • 難点
    • ステートを持ったコネクションをプーリングするのは難しいでしょう。たとえばMySQL(DBD::mysql)とか。注意を払って使えば、memcachedやRedis相手ならいいかもしれません。
    • プロセス間でやりとりできるのはファイル記述子であって、Cache::Memcached::FastやDBIインスタンスではないので、使う側はファイル記述子からドライバのインスタンスを作らないと、実用は困難。でも既存のドライバにはそのような機能(ファイル記述子からインスタンスを作る/インスタンスからファイル記述子を得る)がないものが多い。