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

eldap_pool というライブラリを作ってみた

作ってみたというよりは既存のライブラリを組み合わせてみた、という方が正しいです。

eldap という、古い LDAP ライブラリはあるのですが、これがコネクションプールには対応していなかったので、実際に使うには厳しいのかなぁと考えていたので対応させてみる事にしました。

また eldap 自体もある程度使い込んでリファクタリングやテストの追加などが出来ればと。

ソース

動くかどうかわかりません。まだ試していません ... コンパイルが通った程度です。

目的

  • eldap の整備
  • poolboy を使ってみる

eldap

https://github.com/etnt/eldap

fork したのは https://github.com/voluntas/eldap です。

いくつか修正しました。

  • rebar.config を設定する
  • eldap.app.src を追加し eldap.app を削除
  • .gitignore を更新
  • xref で見つけた古いモジュールを新しいモジュールに切り替える

後で pull-request 出しておきます、採用されるかどうかは知りませんが。

poolboy

https://github.com/devinus/poolboy

ワーカープールモデルを簡単に作る事ができる素晴らしいライブラリです。
Riak でも使われていたりします。使い方は *.app の env に設定するだけです。

size と max_overflow というのがあります。size は初期値で、max_overflow はプールが空だった場合、最大どこまでプールに worker を追加して良いか、です。

あとは、{key, value} で好きに追加できます。

使い方はとても簡単です。プール名を指定して worker を借りて、その worker を使って処理をしてあとは worker を返す。といった物です。worker が落ちたりしたらその worker は supervisor によって復活させられます。

Poolboy の README より拝借

Worker = poolboy:checkout(PoolName),
Reply = gen_server:call(Worker, WorkerFun),
poolboy:checkin(PoolName, Worker),
Reply.

実装

方針はまずは simple_bind が出来て認証出来るようにするです。 worker は gen_server で書きます。init の部分で application の env に設定した値が取得できるのであとは proplists:get_value/2 で取得します。

コネクションを保持してあとはそれを借りるという方針です。

ライブラリで使う事が前提なので eldap_pool.app には何も書いていません。

未実装

まだ、プールに worker を追加する部分を書いていません。

感想

poolboy はとても良く出来ていて、かなり楽が出来ます。eldap は Erlang R8 や R9 時代に書かれたものなので、かなり怪しいです。色々テストしてみる必要があるなぁと感じました。

今後

LDAP がコネクションプールで接続できるようになったら次は Kerberos 認証かなぁと思っています。ちょうど Erlang でそんなライブラリがあったので触ってみようかなと。ただ、これもかなり古いんですよね ... 。

https://github.com/mikma/egssapi

まずは、Kerberos と簡単に認証できるところまで持って行こうと思います。というか egssapi の rebar 化と NIF 化が必須ですね ... 。