我々が扱っている知識は木構造であることが多い
RDBに木構造のデータを格納する際は表変換を行う必要があり、データ構造が煩雑になりやすい
当研究室では木構造をそのまま格納できる分散木構造データベースJungleの開発を行っている
当研究ではJungle上に組織の許認可管理アプリケーションmaTrixを実装しデータベースの表現力、機能の十分性、実用的な性能実証実験を行う
Jungleとは、並列信頼研で開発されているデータベース
非破壊であるため、新しい木構造を作成することでデータの編集を行う
非破壊的木構造は通常の木構造である破壊的木構造に比べ、以下のような利点を持つ
ロックが少なく、いつでもコピーが可能なことから、非破壊的木構造はスケーラブルなシステムに有用となる
maTrixとはSymphony社が開発しているアカウント管理、許諾判定システム
人、組織、役割等の情報を木構造として保持しており、Idでお互いに参照し組織構造を表現している
またそれらの組織構造は構成情報という名前で版管理されている。
許認可の判断は、ポリシーファイルに記述されたルールにそって行われる
ポリシーファイルは組織構造を参照するため木に対する参照機能が必要になる
以下のXMLは、maTrixの人物Treeの一部である。
この様にJungleでは木構造のデータを読み込み、木同士の参照はIdの検索を用いて表現する。
maTrixは、組織構造を構成情報モデルとして表現し版管理している。
構成情報モデルはversion毎に存在し、各versionに対応した組織構造を構成する木構造の集合を保持している。
maTrixは全ての変更を構成情報として保持し、いつでもアクセス可能である。
JungleのTreeは、全てのversionのTreeで単一なrevisionIdを保持しているため、過去のTreeにアクセスするためには、revisionIdを保持していればアクセスできる。
それを利用し、Jungle上での過去の変更履歴を保持する構成情報モデルの表現は、構成情報モデルのversionと、各Treeのversionを保持し、関連付ける構成情報モデルTreeを作成し表現した
アクセスしたいversionのノードから対応するTreeのrevisionIdを取得し、そのIdに対応するTreeにアクセスすれば良い。
maTrixを用いた許認可は、組織構造だけでは判断されない
アクセス可能な時間等のアクセスルールは組織構造では表現できないからである。
そこでアクセスルールを定義できるXACML形式で記述したポリシーファイルを用いて許認可管理を行う
XACMLは、subject(誰が)、Resource(何を)、Action(どうするか)を記述する。
以下に許認可管理の流れを示す
Jungleはデータベースであるため、許認可判断を行うためにはデータを参照する関数を実装すれば良い
maTrixの組織構造を表現する為には、Idでの検索機能が必要であるため実装を行った。
JungleのTreeに対する検索は、java8の新機能であるlambda式を用いてfind関数を実装した。lambda式を使用することで、匿名クラスを使う時より簡潔にコードを記述できるようになった。
Jungleの探索はTreeを全探索するので、探索の計算量はO(n)である。
Indexを使用することで効率よく探索を行えるようにする。
Jungleは過去のTreeを全て保持しているため、Treeのversion毎にIndexを持っていることが望ましい。 そこで、メモリの消費量を抑え、各versionのTreeにIndexをもたせる方法として、FunctionalJavaのTreeMapを使用したIndexの実装を提案する
FunctionalJavaのTreeMapは、データの更新が行われた際に、一度作られたTreeに対して更新を行わず過去のTreeを再利用し、更新後のTreeMap新しく返すため、メモリの使用量を抑えつつ複数のversionでIndexを保持できる。
最初のTreeMap<String key,TreeMap>はIndexを格納するTreeMapである。
このTreeMapに対しkeyでgetを行うと、keyに対応するIndexが登録されている場合、Indexを取得できる。
取得したIndexに対しvalueでgetを行うと、valueの値を持つNodeのListが返ってくる。
TreeのNodeの編集には、編集を行いたいNodeへのPathが必要である。
ParentIndex実装前は、Indexを使って検索したNodeを編集するために返り値はList<Pair<TreeNode,NodePath>>になっていた。
JungleのNodeへのPathは不変ではない
よってTreeに変更が加わる度にIndexの中のPathを更新する必要があり、そこがネックだった
ParentIndexを実装することでTreeNodeさえあれば、Pathが取得できるようになった。
Treeは、version毎に固有のrevisionIdを持っている
アクセスしたいTreeのrevisionIdを引数に取り、対応する過去のTreeを返すgetOldTree(long)を実装した。
データの参照関数と、組織構造の表現が出来たため実際にポリシーファイルを読み込んで許認可判断を行いたい
ポリシーファイルを読み込んでJungleのデータを参照し、許認可を判断するInterpreterを実装した
これで実際にJungleの上で許認可判断が行えるようになった
push/popの実装
IndexのIncrementalUpdate
differencialList
exponential backoff