【ITニュース解説】リアクションを効率化するRBT、レンダリングを軽量化するcontent-visibility

2024年11月13日に「Gihyo.jp」が公開したITニュース「リアクションを効率化するRBT、レンダリングを軽量化するcontent-visibility」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

Misskeyは、利用者が快適に使えるよう、そして運営費用を抑えられるよう、様々な技術でパフォーマンス改善を進めている。リアクション処理を効率化するRBTや、画面表示を軽くするcontent-visibilityなどがその例だ。利用者が増えても安定稼働するよう工夫している。

ITニュース解説

Misskeyは、ユーザーが活発にコミュニケーションを取る分散型SNSである。多くの利用者が存在するサービスでは、サーバーの安定稼働と高速な動作が極めて重要となる。これは、ユーザー体験の向上だけでなく、サービスを運営する上でのコスト削減にも直結するからである。この解説では、Misskeyがどのようにしてそのパフォーマンスとスケーラビリティを改善しているのか、その具体的な取り組みの中から「RBT」と「content-visibility」という二つの技術に焦点を当てて説明する。これらは、システムエンジニアを目指す上で、効率的なシステム設計やWebページの最適化がいかに重要であるかを理解するための良い事例となる。

まず、RBT(Reaction Button Tree)について解説する。MisskeyのようなSNSでは、ユーザーが投稿に対して「いいね」や「爆笑」といった様々なリアクションを送ることが一般的である。従来のシステムでは、これらのリアクションをデータベースに保存する際、各リアクションの種類や数が増えるにつれて、処理が複雑になり、サーバーへの負荷が増大する傾向にあった。例えば、ある投稿に対して数百種類のリアクションが送られた場合、それぞれのリアクションを個別に集計したり、追加したりするたびに、データベースに対して多くの問い合わせが発生し、それがサービスの応答速度を低下させる原因となる。

RBTは、このリアクションの管理方法を根本的に見直すことで、効率化を実現する技術である。具体的には、リアクションの種類を個別のデータとして扱うのではなく、「ツリー構造」と呼ばれる階層的なデータ構造で管理する。ツリー構造とは、データが木のように枝分かれして関連付けられる形を想像すると良い。例えば、ある投稿に対する全てのリアクションを大きな木と見立て、それぞれのリアクションの種類が木の枝、そして各リアクションの数がその枝についた葉の枚数といった具合である。この構造を採用することで、リアクションの追加や、ある投稿に対する全てのリアクションの集計が、従来の方式よりもはるかに高速に行えるようになる。データベースへのアクセス回数が減り、一度の処理でより多くの情報を効率的に取得できるようになるため、サーバーの負荷が大幅に軽減される。結果として、ユーザーはよりスムーズにリアクションを送受信できるようになり、運営側はサーバーリソースを節約できるため、コスト削減にもつながる。これは、ユーザーが増え、リアクションの種類が増加しても、サービスが安定して動作し続ける「スケーラビリティ」を高める上で非常に重要な改善である。

次に、content-visibilityについて説明する。Webページ、特にMisskeyのようなタイムライン形式のSNSでは、非常に多くの投稿が縦に連なっている。ブラウザがこれらのWebページを表示する際、「レンダリング」という処理を行う。レンダリングとは、WebページのHTMLやCSSの情報を解析し、画面上にピクセルを描画して表示する一連の過程を指す。従来のブラウザの動作では、ユーザーがスクロールしてまだ画面に表示されていない部分のコンテンツであっても、裏側では常にレンダリングの準備を進めてしまうことが多かった。これは、画面外にある要素も常にレイアウトの計算や描画処理の対象となり、CPUやメモリといったコンピューターのリソースを無駄に消費する原因となっていた。投稿数が非常に多いSNSのタイムラインでは、この無駄が積み重なることで、ページの読み込みが遅くなったり、スクロールがカクついたりするなどのパフォーマンス低下を引き起こすことがあった。

content-visibilityは、CSS(Webページの見た目を定義する言語)の新しいプロパティであり、この問題を解決するために導入された。content-visibility: auto;という設定をWebページの特定の要素に適用すると、その要素が画面の表示領域(ビューポート)外にある間は、ブラウザはその要素のレンダリング処理をスキップするようになる。つまり、「今は画面に表示されていないから、レンダリング作業は後回しでいい」とブラウザに指示を出すことができるのである。これにより、ユーザーがWebページをスクロールしてその要素が画面内に現れるまで、不必要なリソースの消費を防ぐことが可能になる。

ただし、content-visibilityを単独で使うと、要素が画面外にある間はレンダリングされないため、その要素の高さが確定せず、スクロールしたときに画面がガタつく(レイアウトシフトが発生する)可能性がある。これを防ぐために、contain-intrinsic-sizeという別のCSSプロパティと組み合わせて使用する。contain-intrinsic-sizeは、「この要素がレンダリングされていなくても、だいたいこれくらいの高さがあるだろう」というおおよその高さをブラウザに教えておく役割を持つ。例えば、contain-intrinsic-size: 200px;と設定すれば、画面外にある要素は一時的に200ピクセルの高さを持つものとして扱われる。これにより、画面に表示された際に急にレイアウトが大きく崩れることなく、スムーズなスクロール体験を提供できる。content-visibilityとcontain-intrinsic-sizeを組み合わせることで、Webページの初期表示速度が向上し、スクロール時のパフォーマンスも改善される。これは、ユーザーが感じるWebサイトの応答性や快適さに直接影響する重要な改善点であり、特にモバイルデバイスでのバッテリー消費量の削減にも寄与する。

まとめると、Misskeyが取り組むRBTとcontent-visibilityは、それぞれ異なるアプローチでサービスのパフォーマンスとスケーラビリティを高めるための技術である。RBTはデータベース設計の改善を通じてサーバー側の処理効率を向上させ、content-visibilityはフロントエンド、つまりユーザーのブラウザ側での描画処理を最適化する。これらの地道な改善活動は、単に新機能を追加するだけでなく、サービスを安定して提供し続け、将来的なユーザー増加にも対応できるよう、基盤を強化するために不可欠な取り組みである。システムエンジニアを目指す上で、このようなパフォーマンス改善の視点を持つことは、より効率的で持続可能なシステムを設計・開発するために非常に重要となる。