1. 現代のプロダクト
現代のプロダクトは、もはや「ただのプログラム」とは呼ばれません。1 つのプロダクトの中に、数十のプログラム、数百のインターネットサービス、そして多数の API が含まれ、これらは展開先のクラウドのデータセンター(データ処理センターとも呼ばれます)によって提供されています。
多くの現代的なプロダクト(ほとんどすべてと言ってよいでしょう)は、パラダイム クライアント-サーバー に従って動作します。これは、あなたのデバイス(スマートフォン、ノート PC、デスクトップ)上にユーザー(あなた)とのやり取りを担うプログラムがあり、重要な機能は専用サーバー側にあって、そこで重要な処理が行われる、という形です ➡️🖥️
ときには、あなたのクライアントが複数の独立したサーバーと通信することもあれば、あるプロダクトのサーバーが別のプロダクトのサーバーにアクセスすることもあります。結果として、クライアントとサーバーが相互に連携するグローバルなネットワークが形成されます。
そのため、現代のアプリケーションモデルは、むしろ パラダイム クライアント-インターネット-サーバー と表現したほうがよいかもしれません。そこには非常に多くの複雑な通信が存在するからです。誰にいつあなたのリクエストを送るかを自動で判断する、いわゆる「スマートな通信チャネル」さえ登場しています。🛰️📡
2. クライアント
クライアントプログラムは、大きく 4 つのカテゴリに分けられます:
- 🖥️ デスクトップクライアント — コンピュータ上で動作するプログラム。
- 📲 モバイルクライアント — iOS または Android 向けアプリ。
- 🌐 ウェブクライアント — ブラウザで動作するサイト/ウェブアプリケーション。
- 🌍 サーバークライアント — 別のサーバー上で実行されているアプリケーション。
さらに各カテゴリは細分化できます。例えば、ウェブクライアントはサイトまたはウェブアプリであり、つまり ブラウザと、そこに読み込まれるサイト から成ります。ブラウザも同じではなく、動作が異なることがあります。
最も普及しているブラウザを対象にしたとしても、読み込まれる「サイト」側の違いは残ります。サイトは通常、次の 3 要素で構成されます:
- 📄 HTML
- 🎨 CSS
- ⚡ JavaScript
「これほど簡単なものはない」と思うかもしれません。しかし、いまや単なる HTML と JavaScript だけでサイトを書く人はいません。サイト開発では、単なるライブラリではなく、本格的なフレームワーク——React、Angular、Vue——が使われます ⚛️。もはや「サイト」というより、ビルド、テスト、独自のパラダイムを備えた本格的なウェブアプリケーションです。
純粋な CSS だけを使うことも、いまではほとんどありません。CSS を生成するための CSS プリプロセッサや、丸ごとの CSS フレームワークが存在します。さらには、メール用の専用 CSS フレームワークまであり、あなたのメールがブラウザでも多くのメールクライアントでも美しく表示されるようにしてくれます 💌。
素の JavaScript だけで書くことも、今ではほとんどありません。大規模なウェブアプリは TypeScript で作られ、その後 JavaScript にコンパイルされます。もう、お分かりですよね…
3. インターネットとインフラストラクチャ
クライアントとサーバーの通信——これ以上簡単なものはない、と思うかもしれません。しかし、その関係でさえ、すでに大きく変化しています。
あなたのプロダクトは、おそらく現代的なデータセンターのいずれかに配置されるでしょう。世界中の多くの企業が、自社サーバー上でもあなたの自前の物理サーバー上でも、さまざまなホスティングサービスを提供しています。お金さえ払えば、望むものはほぼ何でも手に入ります。
物理サーバーは、もはや「物理」だけではありません。現代のデータセンターは、仮想サーバーのレンタルを提供しています。仮想サーバーとは仮想的なコンピュータであり、1 台の物理サーバー上に数十台稼働させることも可能です。その代わり、サーバーのアップグレードという観点ではとても便利です。もしメモリがもっと必要なら、数分であなたの仮想サーバーに追加できます ⏱️.
しかし、このアプローチさえも古くなりつつあります。今は クラウド への移行が主流です——単にデータセンター内の仮想サーバーにデプロイするだけでなく、そのデータセンターが提供する幅広いインフラやサービスを積極的に活用する形です。
バックアップ保存用のサーバーが必要なら、クラウドにはそれ専用の使いやすいインフラがあります。信頼性 99.9999999% のデータベースが必要ですか? それもあります。Kafka、RabbitMQ、NoSQL? すでに用意されていて、簡単に設定できます。あとはお金を払うだけ。
そして、これらのデータセンターやクラウドそのものがあなたのプロダクトの一部になり始めています。たとえば Amazon は世界中に多数のデータセンターを持っており、CDN というサービスを提供しています。あなたのパブリックコンテンツは Amazon のすべてのデータセンターにキャッシュされ、世界中のユーザーがより高速にそれを受け取れるようになります 🛰️.
また、あなたのアプリの API へのリクエストを Amazon Gateway API というサービス経由で通すこともでき、各種サービスとの連携を非常に柔軟に構成できます。複数のサービスへの負荷分散、DDoS 攻撃の緩和、ファイルの自動アップロード、スマートなキャッシュの設定など、できることは数え切れません 🛡️.
このように、クライアントアプリとあなたの各種サービスの間には、設定可能な「スマートな通信」が数多く存在します。たとえあなたが直接それを扱わないとしても、それらが存在し、あなたのプログラムの動作に大きな影響を与え得ることは知っておくべきです。
そして、ルーター、5G 基地局、衛星、そして海底のインターネットケーブルといった話題には、まだ触れてもいません。サーバーからクライアントへ映像ストリームを送っているのに、クライアント側の回線品質が悪く接続が頻繁に切れてしまうことがあります。その問題を解決するのは誰でしょう? それはあなたです 😅
4. サーバー
「サーバー」という言葉の背後には、まったく異なる概念が隠れていることがあります。代表的なものについて知っておくと役に立ちます。
- 🖥️ 物理サーバー
物理サーバーとは、プロセッサ、メモリ、ストレージといったリソースを備えた独立したコンピュータとしての機器で、データ処理やさまざまなソフトウェアアプリケーションの稼働を担います。これらはデータセンターに設置され、ウェブサイト、アプリケーション、データベース、その他のサービスをホスティングするための計算資源を提供します. - 🪐 仮想サーバー
仮想サーバーとは、物理サーバー上で動作するソフトウェア的にエミュレートされたサーバーです。仮想化技術により、1 台の物理サーバーを複数の分離された仮想サーバーに分割でき、それぞれが独自のオペレーティングシステムを持ち、個別に再起動・設定できます。 - 🕹️ サーバープログラム(例: Nginx)
Nginx のようなサーバープログラムは、ウェブリソースへのリクエストを処理するためのサーバー側ソフトウェアです。Nginx はウェブサーバーとして広く知られていますが、メールプロキシサーバーやマイクロサービスアーキテクチャにおけるリバースプロキシ、さらにはロードバランサーとしても機能します。 - 💾 データベースサーバー
データベースサーバーは、データベースの管理とその問い合わせ処理に特化したサーバーです。データの集中保管と処理を担い、ネットワーク経由でデータへのアクセスを提供します。トランザクション処理、検索、更新をサポートし、情報の信頼性とセキュリティを確保します。代表例として MySQL、PostgreSQL、Oracle Database、Microsoft SQL Server があります.
そして、どこかのデータセンターの仮想サーバーの 1 台で、あなたのプロジェクト(C# と ASP.NET Core)が稼働することになるでしょう。データベースと連携し、Nginx や Azure Application Gateway を経由してリクエストを受け取り、動作ログは Azure Monitor や Splunk のような監視システムへ送られます 📈.
しかし、あなたのコードのおかげで、あなたのプロダクトの何百万人ものユーザーが満足するのです。彼らはサービスを利用し、対価を支払い、最終的にはプロダクトのオーナーも満足します。会社の株価は上がり、あなたはストックボーナスを手にして — 幸せになれるでしょう 💸。これぞ業界における本当の幸福の循環です :)
GO TO FULL VERSION