Airbnbは最近、コラボレーションホスティング向けの統合アーキテクチャをどのように設計・構築したかについて詳しく説明した。このアーキテクチャによって新製品の開発プロセスが効率化される。エンジニアがすべてのホスティングユースケースをカバーする1つの中央フレームワークについて知るだけでよいためである。このフレームワークによって、特定のタイプのコラボレーションホスティングがカプセル化され、エンジニアがそのことを気にする必要がなくなる。
最初は、1ホスト(人)が各資産を管理していた。その後、Airbnbは共同ホストを導入した。ホストが家族や近い人など、信頼できる別の人と責任を共有することが多いためである。今日、Airbnbホスティングは、ビジネスの一部として取り組んでいる多くのホストの管理業務である。これらのユーザは、他のユーザのチームと各ユーザの役割を管理する。
AirbnbのエンジニアAngeline Rao氏は、「コラボレーションホストの数が増え、新しい形式のコラボレーションが導入されるにつれて、それらをサポートするためのエンジニアリング作業はより複雑になる」と述べている。彼女は、これらのビジネス要件をカプセル化する動機を要約している。
新しい機能を開発するエンジニアは、既存のタイプのコラボレーションホスティングをすべて理解する必要があります。そして、コラボレーションホストが機能とどのように対話するかを決定する必要があります。(...)統一されたフレームワークがなければ、ホスト向けの製品開発はすぐに面倒なプロセスになります。
単一のホストモデルでは、エンジニアは各リストにホストIDを簡単に保存できた。それにより、そのリストを操作する権限を誰が持っているかを判断できる。この権限チェックは次のようになる。
if (isListingHost) {
// Take action on the listing
}
Airbnbが共同ホスティングやチームなどの新しい形式のコラボレーションホスティングを追加すると、このコードは扱いにくくなる。コードベース全体の権限チェックは、次のように開始できる。
if (isListingHost ||
isListingCoHost ||
isListingTeamMember ||
isListingCollabHost1 ||
isListingCollabHost2 ||
...) {
// Take action on listing
}
新しいフレームワークでは、Airbnbは「ユーザグループ」を使って任意のグループの人々を表す。ID、グループタイプ(共同ホスティング、チームなど)、メンバーリストによって各グループが定義される。各グループメンバーは、そのグループ内の役割(所有者、共同ホストなど)に関連付けられる。そして、セントラルロケーションは、ユーザグループとシステム内のリソース(リスト、予約など)の間のすべての関連付けをメンテナンスする責任を持つ。
出典: https://medium.com/airbnb-engineering/how-airbnb-supports-co-hosting-edfb11d88575
イベントは、コラボレーティブホスティングの関係やリソースが更新されるたびに、関係する関連を更新するようにシステムをトリガーする。このイベントには変更の詳細は含まれないことに注意してください。代わりに、特定のリソースやグループへの変更があったことと、それらのIDを指定するだけである。次に、システムはデータをフェッチし、結果整合性を担保する方法で正しい関連を計算する。
出典: https://medium.com/airbnb-engineering/how-airbnb-supports-co-hosting-edfb11d88575
この方法でイベントを処理することで、Airbnbのエンジニアは更新を並列化とバッチ処理することで、パフォーマンスを最適化できる。さらに、各リソース更新イベントで関連の再計算がトリガーされるが、それが特定のタイプの更新に依存しないものであるため、更新プロセス全体がべき等となる。
このシステムが整った環境では、開発者はコラボレーティブホスティングの詳細を知る必要がない。代わりに、この単一ロケーションのデータによって、特定のユーザとリソースの関係を理解できる。
このシステムに加えて、Airbnbはいくつかのパターンを作成した。このパターンにより、開発者が特定のアクションの権限を照会したり、ユーザごとにリソースを許可したり、リソースごとにユーザを紐づけたりできる。これによって、開発がさらにシンプルになる。これらのパターンでは、権限をクエリするためにHimejiを使用し、クエリを容易にするためにユーザをリソースデータとのリソースの関連に参加させるためのElasticSearchを使う。