【ITニュース解説】The Dashboard Dilemma
2025年09月05日に「Dev.to」が公開したITニュース「The Dashboard Dilemma」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
リアルタイムでの複雑な業績データ集計は、ダッシュボードの表示速度低下が課題だ。解決策としてDBのマテリアライズド・ビュー機能が有効。過去データは事前に集計・保存し、当日分のみを計算して結合することで高速化。pg_cronによる自動更新で、低コスト・高速なシステムを実現する。
ITニュース解説
企業活動において、売上や営業成績といった様々なデータを分析し、素早い意思決定を下すことは非常に重要である。そのために多くの企業で活用されているのが「ダッシュボード」だ。ダッシュボードは、重要な経営指標(KPI)をグラフなどで可視化し、一目で状況を把握できるようにするツールである。しかし、このダッシュボードを開発するエンジニアにとっては、常に大きな課題がつきまとう。それは、ビジネス部門から寄せられる「できるだけリアルタイムに、正確なデータを、素早く表示してほしい」という、一見シンプルだが実現が難しい要求である。
この記事では、あるエンジニアが複雑なデータを扱う組織全体のダッシュボード開発に挑んだ際の、課題解決の過程を解説する。まず、開発者が直面したのは、要求の曖昧さだった。ビジネスサイドが求める「速く、最新のデータ」という言葉だけでは、システムを設計するための具体的な目標を立てることができない。そこで重要になるのが「Freshness SLA」という考え方だ。これは「データの鮮度」に関する取り決めのことで、表示されるデータが最大でどのくらい前のものまで許容できるかを定義する。例えば、一秒を争う株の高速取引システムではデータの遅延は許されないが、行政の書類確認システムであれば、数時間の遅延は問題にならないかもしれない。この開発者は「データが15分古くても問題ないですか?」と具体的な質問を投げかけることで、「データの遅れは最大15分まで、表示速度は3秒未満」という明確な開発目標を設定することに成功した。
目標が定まったものの、次に立ちはだかったのはデータの複雑さだった。今回開発するダッシュボードは、営業メンバー個人の成績だけでなく、チームや部署全体のパフォーマンスも階層的に表示する必要があった。さらに、メンバーの昇進やチーム異動といった組織変更も考慮し、過去に在籍したメンバーの貢献度も含めて集計しなければならない。電話履歴や顧客情報など、複数のデータベースに散らばった情報を組み合わせて、複雑な計算を行う必要があったのだ。
この難題を解決するため、開発チームは三つの技術的アプローチを検討した。一つ目は「キャッシング」である。これは、一度計算した結果をメモリなどの高速な記憶領域に一時的に保存しておき、再度同じ要求があった際に素早く応答する手法だ。しかし、今回のダッシュボードはデータの階層構造が複雑で、キャッシュすべきデータ量が膨大になる。また、あまり頻繁に閲覧されない期間(例えば昨年度のデータ)の表示を求められた場合、キャッシュにデータが存在しない「キャッシュミス」が多発し、結局、時間のかかるデータベースへの問い合わせが発生するため、根本的な解決策にはならないと判断された。
二つ目は「バッチ処理」だ。これは、アクセスが少ない夜間などに、日中のデータをまとめて計算し、集計済みのデータを用意しておく方法である。事前に計算しておくため表示は速くなるが、リアルタイム性に欠けるという大きな弱点がある。また、専用のシステムを構築する必要があり、開発や運用の手間が増えることも懸念された。
三つ目は「ストリーミング」だ。これは、アプリなどからデータが発生した瞬間にリアルタイムで処理し、ダッシュボードに反映させる手法である。リアルタイム性は最も高いが、今回の要件である複雑な集計やデータの結合を、データが発生するたびに行うのは処理の負荷が高すぎる。結果として、目標である3秒未満の表示速度を達成できない可能性があった。
どの方法にも一長一短がある中、開発者が最終的に採用したのは、これらの手法の長所を組み合わせた「インクリメンタルリフレッシュ(段階的更新)」と呼べるハイブリッドなアプローチだった。まず、アプリから発生する通話履歴などのデータは、ストリーミング技術(Kafka)を使ってリアルタイムにデータベースへ書き込む。これにより、データベース自体は常に最新の状態に保たれる。
次に行ったのが、集計処理の高速化だ。ここで「マテリアライズド・ビュー」というデータベースの機能が活躍した。これは、時間のかかる集計クエリの実行結果を、あらかじめ物理的なテーブルとして保存しておく機能である。この機能を使うことで、ダッシュボード表示のたびに重い計算処理を実行する必要がなくなり、応答速度を劇的に改善できる。しかし、マテリアライズド・ビューは自動では更新されないという課題がある。
この課題を解決したのが、「過去のデータは不変である」という事実に着目した点だ。開発者は、昨日までの膨大な過去データと、常に変動する「今日のデータ」を分けて考えることにした。そして、昨日までのデータはマテリアライズド・ビューとして夜間に一度だけまとめて作成・保存しておく。ダッシュボードが表示される際には、この事前に計算済みの過去データと、量の少ない「今日のデータ」だけをリアルタイムに計算して合算して表示する。これにより、毎回計算するデータ量を大幅に削減し、高速なレスポンスを実現したのだ。
さらに、このマテリアライズド・ビューの夜間更新を自動化するために、「pg_cron」というデータベース(PostgreSQL)の拡張機能を利用した。これは、データベース内で直接、定期的な処理実行のスケジュールを組めるツールである。これを使えば、更新処理のためだけに別のサーバーを構築する必要がなく、インフラのコストや管理の手間を最小限に抑えることができる。
この事例は、単一の完璧な技術に頼るのではなく、それぞれの技術の特性を深く理解し、直面している課題の本質に合わせて賢く組み合わせることの重要性を示している。ビジネスの要求と技術的な制約の間で、最適なバランスを見つけ出し、現実的でエレガントな解決策を導き出した好例といえるだろう。