はじめに
エンジニアのみなさま、日々の学習本当にお疲れ様です!
また本記事まで足を運んでいただき本当に感謝です。
最後まで読んでもらえると幸いです。
前回の投稿でシステム設計を学ぶためのオープンソースプロジェクト 「system-design-primer」 を紹介しました。
システム設計トピックス: まずはここからの順番に沿って、システム設計に必要な観点の理解を深めていこうと思います。
第一弾は スケーラビリティ についてアウトプットしていきます!
system-design-primerで取り上げられているトピックスは以下になります。
垂直スケーリング
水平スケーリング
キャッシング
ロードバランシング
データベースレプリケーション
データベースパーティション
スケーラビリティとは
システムの負荷の増加に応じて拡張できる能力を指します。
システムの負荷の要因としては、『ユーザー数』 や 『データ量』 の増加が挙げられます。
システムをリリースした後、設計当初の想定よりもユーザー数や扱うデータ量が増えると負荷がかかり、システムの応答速度などに影響が出てきます。スケーラビリティを考慮することで、システムのパフォーマンスや安定性を維持し、将来的な改修や拡張にかかるコストを抑えることができます。
垂直スケーリングと水平スケーリング
キャッシング
頻繁にアクセスされるデータを一時的に高速なメモリ(キャッシュ)に保存することで、データベースやアプリケーションサーバーへのアクセスを減らし、システムの応答速度を向上させる方法です。
キャッシュの適用箇所の例で言うと、ECサイトでは 『商品情報や価格表示』 や 『ユーザーのブラウジング履歴』 、ソーシャルメディアやニュースサイトでは 『トレンド記事や人気投稿』 、データ分析やレポート生成では 『定期的に実行される分析や集計処理の結果』 などが挙げられます。
ロードバランシング
ロードバランサー の仕組みを使います。水平スケーリングで複数のサーバーを用いる際には、ロードバランサーを使用してリクエストの振り分けを行うことで、システム全体の安定性が向上します。ラウンドロビンやIPベースの分散方法が一般的ですが、サーバーの応答状況に応じて動的に負荷分散を行う手法もあります。
データベースレプリケーション
データベースの内容を複数のサーバーにコピーし、読み取りリクエストを複数のデータベースに分散させることで、読み取りパフォーマンスの向上と冗長性の確保を図る方法です。マスタースレーブ型やマルチマスター型のレプリケーション方式があり、可用性が向上するだけでなく、障害発生時の復旧も迅速になります。ただし、リアルタイム性が求められるアプリケーションでは、レプリケーションの遅延による整合性の問題に注意が必要です。
データベースパーティション
データを分割して別のテーブルやデータベースに格納することで、データ量が多い場合でも効率的に処理できるようにする手法です。水平パーティション(データの行ごとに分割)や垂直パーティション(特定の列ごとに分割)などの方式があります。パーティションにより、特定のデータへのアクセスや更新が集中した場合でも負荷を分散させられるため、大量データの効率的な処理が可能になります。
さいごに
スケーラビリティの向上には、上記の手法を組み合わせて用いることが効果的です。例えば、水平スケーリングとロードバランシングを併用することで、大量のリクエストにも迅速に対応でき、キャッシングとデータベースレプリケーションを組み合わせることで、読み取り性能を向上させつつ、データの一貫性も保てます。さらに、データベースパーティションにより、特定のデータに対するアクセスの負荷を分散できるため、柔軟かつ持続可能なシステム設計が可能になります。
と書きましたが、正直まだまだ理解が足りていない部分も多いと思います。
ニュアンスが違ったり、こういう考え方もあるよ!があればぜひコメントで教えていただけると嬉しいです...!
お手柔らかにお願いしますm(_ _)m
おまけ
弊社のご紹介もさせてください!
「日本で一番エンジニアが成長できる会社を創る」
エンジニアリングの募集
PM・Webディレクションの募集
セールス・事業開発の募集
コーポレート系の募集
コンサルティングの募集
弊社メンバーは日々学習した内容をアウトプットしております!
少しでもご興味を持たれた方は求人を見てみてください!
ご応募もお待ちしております!