AEM 6 の AEM プラットフォームは、Apache Jackrabbit Oak に基づいています。
Apache Jackrabbit Oak は、昨今の世界規模の web サイトや、要求の厳しいその他のコンテンツアプリケーションの基盤として使用する、スケーラビリティとパフォーマンスに優れた階層構造のコンテンツリポジトリを実装するための取り組みです。
これは Jackrabbit 2 の後継であり、コンテンツリポジトリである CRX のデフォルトのバックエンドとして AEM 6 で使用しています。
Oak が JSR-283 (JCR 2.0) 仕様。 主な設計目標は次のとおりです。
ストレージ層の目的は次のとおりです。
Oak Core は、ストレージレイヤーに複数のレイヤーを追加します。
Oak JCR の主な目的は、JCR セマンティクスをツリー操作に変換することです。また、次の役割も果たします。
また、Oak JCR の概念の一環として、Java 以外の実装も可能になりました。
Oak ストレージレイヤーは、コンテンツの実際のストレージの抽象化レイヤーを提供します。
現在、AEM6 では 2 つのストレージ実装(Tar ストレージと MongoDB ストレージ)を使用できます。
Tar ストレージは tar ファイルを使用します。 これにより、大きなセグメント内の様々なタイプのレコードとしてコンテンツが保存されます。 ジャーナルは、リポジトリの最新の状態を追跡するために使用されます。
デザインに関する主要な原則は、次のとおりです。
コンテンツは、最大 256 KB のセグメントに保存されます。 このセグメントは不変であり、そのため、頻繁にアクセスされるセグメントを簡単にキャッシュして、リポジトリの破損につながるシステムエラーを削減できます。
各セグメントは、一意の識別子 (UUID) で識別され、コンテンツツリーの連続したサブセットを含みます。 また、セグメントは他のコンテンツを参照できます。 各セグメントには、参照先の他のセグメントの UUID のリストが保持されます。
ノードとその直近の子などの関連レコードは、同じセグメントに保存されます。 これにより、リポジトリの検索が高速になり、セッションごとに複数の関連ノードにアクセスする一般的なクライアントのキャッシュミスのほとんどが回避されます。
レコードのフォーマットは、IO コストを削減し、キャッシュにできるだけ多くのコンテンツを収めるために、サイズに合わせて最適化されます。
MongoDB ストレージは、MongoDB を使用してシャーディングとクラスタリングをおこないます。 リポジトリツリーは、1 つの MongoDB データベースに保存されます。各ノードは別々のドキュメントです。
これにはいくつかの特殊性があります。
コンテンツの更新(コミット)ごとに、新しいリビジョンが作成されます。 リビジョンは、基本的に次の 3 つの要素で構成される文字列です。
ブランチがサポートされ、クライアントは複数の変更をステージングし、1 回の結合呼び出しで表示できるようになります。
MongoDB ストレージは、変更のたびにドキュメントにデータを追加します。 ただし、クリーンアップが明示的にトリガーされた場合にのみ、データが削除されます。 特定のしきい値に達すると、古いデータが移動されます。 以前のドキュメントには不変データのみが含まれています。つまり、コミットおよびマージされたリビジョンのみが含まれています。
クラスター操作を容易にするために、アクティブおよび非アクティブなクラスターノードに関するデータは、データベースに保持されます。
MongoDB ストレージを使用した一般的な AEM クラスターのセットアップは次のようになります。
Oak は JCR 1.0 標準と後方互換性があるので、ユーザーレベルではほとんど変更はありません。 ただし、Oak ベースのAEMインストールを設定する際には、次の点に注意する必要がある顕著な違いがあります。
AEMプラットフォームの詳細については、以下の記事も参照してください。