Skip to content

Commit 9c021ec

Browse files
update server overvew (#200)
1 parent bcf827e commit 9c021ec

1 file changed

Lines changed: 37 additions & 32 deletions

File tree

src/server-app/overview/README.md

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,20 @@ print "</html>";
6161
```
6262

6363
- Common Gateway Interface の略
64-
- The Apache HTTP Server ("httpd") などのWebサーバでHTTPリクエストを受けて、外部プログラムにHTTPリクエストを渡し、出力をHTTPレスポンスとして返すしくみ
64+
- The Apache HTTP Server ("httpd") などのWebサーバでHTTPリクエストを受けて、外部プログラムにHTTPリクエストを渡し、出力をHTTPレスポンスとして返す仕組み
6565
- Perlが大流行するきっかけとなった
66-
- 当時の主流であるC言語の文字列処理が貧弱だったのに対し、Perlは文字列処理が強力だった
67-
- PerlからMySQL/PostgreSQLに接続してHTTPレスポンスを生成するスタイル
66+
- 当時の主流であるC言語の文字列処理が貧弱だったのに対し、Perlは文字列処理が強力
67+
- PerlからMySQL/PostgreSQLに接続してHTTPレスポンスを生成することができた
6868
- 少し前まではPerlで実装されたプロダクトが存続していたが、最近は流石滅多にないかも
6969
- MovableTypeとか、mixiとか。CookPadもPerlでスタートしたはず
7070
- CGIの仕組み自体はPerl以外でもRubyやPython、シェルスクリプトなど文字列を出力できるプログラムであれば利用できる
7171

72-
CGIはHTTPリクエストを受けるごとに、新しいプロセスをforkする必要があり、Webサーバにとって負荷が高い特徴がありました
72+
初期のCGIはHTTPリクエストを受けるごとに、新しいプロセスをforkする必要があり、Webサーバにとって比較的負荷が高い特徴がありました
7373

7474
![perl_cgi](./perl_cgi.drawio.png "perl_cgi")
7575

76-
そこで1998年頃にはWebサーバのモジュールとしてPerlを動作させる「mod_perl」という方法が考案されています
77-
これによりプロセス管理をapache側で効率的に行えるようになりました
76+
そこで1998年頃にはPerl等のインタプリタをWebサーバのモジュールとして動作させる「mod_perl」が使われるようになりました
77+
これによりプロセス管理をapache側で効率的に行えるようになります
7878

7979
![mod_perl](./mod_perl.drawio.png "mod_perl")
8080

@@ -91,21 +91,21 @@ CGIはHTTPリクエストを受けるごとに、新しいプロセスをforkす
9191
</html>
9292
```
9393

94-
(開発開始は1994年 実質的に最初の公開版PHP 3が1997年 本格普及はPHP 4で2000年)
94+
(開発開始は1994年 実質的に最初の公開版PHP 3が1997年 本格普及はPHP 4で2000年
9595

9696
1. CGIはHTTPリクエストを受けるごとに、新しいプロセスをforkする必要があり、Webサーバにとって負荷が高かった
9797
1. 前述の通りmod_perlという形でPerlを動作させる手法が流行っていた
9898
1. しかし当然ながらPerlはWebサーバのモジュールとして動作させる前提で設計・実装されたものではなく、使い勝手が悪かった
9999
1. 類似の技術としてFastCGIというものもあったが、やはり癖があり使いにくかった
100-
1. そこで最初からWebサーバのモジュールとして実行することを念頭に置いた、Webプログラミングに特化した処理系としてPHPが登場、大流行してPerlを駆逐する
100+
1. そこで最初からWebサーバのモジュールとして実行することを念頭に置き、Webプログラミングに特化した処理系としてPHPが登場、大流行してPerlを駆逐する
101101
1. Facebookも長い間PHPで書かれていた
102102
1. 元々はWebページを動的に生成するためのテンプレート的な言語であったが、機能が追加された結果スクリプト言語としての機能も持つ
103103
1. 動かし方はCGI, mod_php(モジュール形式)などがあり、Perlの項目とほぼ同様の形式で動作する
104104
1. 現在でも広く利用されており、[CakePHP](https://cakephp.org/jp) など今風のフレームワークも存在する
105105

106106
### Java Servlet (サーブレット)
107107

108-
(1996年に初期バージョンが公開 1998年に最初の公式API仕様が確立 2001年にStrutsが登場)
108+
(1996年に初期バージョンが公開 1998年に最初の公式API仕様が確立 2001年にStrutsが登場
109109

110110
Java Servletの例
111111

@@ -155,13 +155,16 @@ JavaのテンプレートエンジンであるJSP(JavaServer Pages)の例
155155
```
156156

157157
1. 1995年Sun Microsystems社がJava言語を売り出した
158-
- 最初にアピールした`Applet`は、Webページの中にJavaのサンドボックス環境を埋め込んでアプリケーションを実行するというものだった。しかし制約が大きいうえにマシンパワーを要求するので、実用的なアプリケーションを作る環境としては、流行らなかった
159-
2. しかしサーバサイドの技術として発表されたサーブレットは2000年ごろから流行し始め、2001年にStrutsが登場するとその人気が決定的になった
160-
1. サーブレットはHTTPリクエストを(CGIのようにプロセスをforkするのではなく)スレッドで処理するので性能が高い
158+
- 昔は`Applet`と呼ばれる、Webページの中にブラウザ上で動作するJavaのサンドボックス環境がそこそこ使われ、アピールもされていた
159+
- しかし制約が大きくマシンパワーを要求するのと、セキュリティ的な問題からあまり流行らなかった
160+
2. 一方でサーバサイドの技術として発表されたサーブレットは2000年ごろから流行し始め、2001年にStrutsが登場するとその人気が決定的になった
161+
1. サーブレットはHTTPリクエストを(CGIのようにプロセスをforkするのではなく)スレッドで処理するので性能が高い
161162
2. Javaは静的に型付けされた言語であるため、Javaで書かれたアプリケーションはPHPよりも品質を確保しやすいかった
162163
3. WebアプリケーションフレームワークであるStrutsによって大人数による開発が効率的に行えるようになり、規模の大きなエンタープライズシステムの実装が可能になった
163-
4. Javaで書かれたコードはポータビリティがあり、サーバのOSやCPUが変わっても、そのまま実行できた。(まだx86系のCPUが市場を独占しておらず、SPARCやAlphaなどのCPUもある程度のシェアを持っていた。)
164+
4. Javaで書かれたコードはポータビリティがあり、サーバのOSやCPUが変わっても、そのまま実行できた。(まだx86系のCPUが市場を独占しておらず、SPARCやAlphaなどのCPUもある程度のシェアを持っていた。
164165
3. カジュアルな(コンシューマ向けの)WebアプリケーションはPHPで、シリアスな(エンタープライズ向けの)WebアプリケーションはJavaサーブレットで書く、という時代が続くことになった
166+
4. Strutsはその後も進化を続け、Struts2が登場したが、Struts1との互換性がなかったため、Struts1を採用していた開発会社に受け入れられなかった
167+
- その後脆弱性問題を連発したため、今日ではまったく人気がない
165168

166169
### Java EE / Spring
167170

@@ -210,11 +213,9 @@ public class HelloController {
210213
3. だが、実際のJava EEアプリケーションサーバ製品は不安定で性能も悪く、プログラミングも難しいものであった。人々はJava EEを信じて使い続けていたが、疑問も大きく膨らんでいった
211214
4. そこに登場したのがSpring Framework(2002年頃)
212215
- 作者のRod JohnsonがExpertt One-on-One J2EE Design and Developmentとともに世に問うたもの。
213-
- Java EE(J2EE) の欠点を指摘し、EJB、とりわけ`Entity Beans`を使うことは断念し、POJO(Plain Old Java Object) をベースに開発することを提唱した
214-
- DI (Dependency Injecttion) のアイデアを普及させ、大規模なJavaアプリケーションを効率よく分業体制で実装する道を切り開いた。
216+
- Java EE(J2EE の欠点を指摘し、EJB、とりわけ`Entity Beans`を使うことは断念し、POJO(Plain Old Java Object をベースに開発することを提唱した
217+
- DI (Dependency Injecttion のアイデアを普及させ、大規模なJavaアプリケーションを効率よく分業体制で実装する道を切り開いた。
215218
5. Spring Frameworkは一世を風靡しただけでなく、今日まで人気を失うことなく、利用されている。
216-
- StrutsはStrus1の後継バージョンであるStruts2が、Struts1とまったく互換性がなかったため、Struts1を採用していた開発会社に受け入れられなかった。
217-
- その後脆弱性問題を連発したため、今日ではまったく人気がない
218219

219220
### Ruby on Rails
220221

@@ -239,22 +240,22 @@ end
239240
- ほとんどの設定項目は、自動的なものであり、設定ファイルのメンテナンスは大量の単純作業であった。
240241
- そこで多くの現場ではExcelなどで主要設定項目を管理し、そのExcelファイルからマクロで個々の設定ファイルを生成するようなことが行われていた。
241242
- Railsでは、これを「デフォルトで定められているディレクトリ構造や命名規則に沿っている限り、設定ファイルは不要とする(特別な場合だけ、設定ファイルを書く)」という方法で解決した。
242-
- たとえばRDBMSのpersonsテーブルに対応するモデルクラスを、ModelsディレクトリにあるPerson.rbファイルとして記述すれば、自動的にDBアクセス可能とするというような具合である
243+
- たとえばRDBMSのpersonsテーブルに対応するモデルクラスを、ModelsディレクトリにあるPerson.rbファイルとして記述すれば、Railsが勝手に解釈してpersonsテーブルを操作するクラスとして扱ってくれる
243244
- こうした開発者体験(Developer Experience)の良さは、Rubyが非常にメタプログラミングをしやすい言語であることで成り立っている。
244245
- Rails 独自の拡張や構文を多数実装することで、上記の哲学を実現している。
245246
2. コマンドラインユーティリティによる開発のサポート
246247
- たとえばあるURLに対応するコントローラクラスのスケルトンをコマンドラインユーティリティから生成できる。
247248
- このようなユーティリティを提供することで、開発者を単純作業から解放し、価値あるコードを書くことへ集中できるようにした。
248249
3. Ruby on Railsに触発されて、別の言語でも同様のフレームワークが多数開発された。
249250
- PHP: CakePHP
250-
- Java: JBoss Seam, Java EE 6, Grails(Groovyを使う)
251+
- Java: JBoss Seam, Java EE 6, Grails(Groovyを使う
251252
- Python: Django
252253
1. 今でも第一線で使われており、githubもRailsで作られ続けている。とはいえ一時期より採用されることは減ってきた。
253-
- 「マイクロサービス」が注目され、小さなアプリケーションを多く作るようになった
254-
- Railsはどちらかというと大きなアプリを作るためのフレームワークであり、マイクロサービスと対比してモノリスアプリの例として扱われる
255-
- とはいえ最近はまた一巡してモジュラーモノリスなど大きなアプリが着目されており、流れが変わりつつあるかもしれない
256-
- pythonが言語として人気であり、その流れでDjangoが採用されることが多い(?)
257-
- Goなどに比べてパフォーマンス面で不利
254+
- 「マイクロサービス」が注目され、小さなアプリケーションを多く作るようになった
255+
- Railsはどちらかというと大きなアプリを作るためのフレームワークであり、マイクロサービスと対比してモノリスアプリの例として扱われる
256+
- とはいえ最近はまた一巡して「マイクロサービスだるくね?モジュラーモノリスでよくね?」的な空気もあり、流れが変わりつつあるかもしれない
257+
- pythonが言語として人気であり、その流れでDjangoが採用されることも多い
258+
- Goなどに比べてパフォーマンス面では若干不利
258259

259260
```bash
260261
rails generate controller User name:string email:string
@@ -275,12 +276,15 @@ Person.create(email: 'hoge@example.com', username: 'hoge') # データの作成
275276
### Ajaxの出現 / フロントエンド+APIサーバの時代
276277

277278
1. Google MapsおよびGmailの出現により、「画面遷移を伴わないWebアプリケーション」というものがユーザーに認知され始めた。2005年ごろのこと
279+
- 今では想像もつかないが、この技術が流行るまで画面上のデータ更新は全て画面遷移を伴っていた
280+
- 「ユーザの見えないところで非同期にデータを更新する」ことができるようになったのがこの辺
278281
2. 技術としてはそれ以前から存在していたが誰も注目してこなかったXMLHttpRequestというJavaScriptの機能を初めて本格的に使用するもの
279-
1. この技法をAsynchronous JavaScript + XMLの頭文字をとってAjax (エイジャックス) と呼ぶようになった。
280-
3. StrutsやRuby on Railsはサーバサイド(バックエンド)側でリクエストを処理して画面も生成するというようなスタイルが中心だった。しかしAjaxが人気を集めるようになるとクライアント(フロントエンド)側で画面描画をすべて行い、バックエンドにはAPIサーバのみを置くというスタイルが人気を集めるようになった。
281-
1. 画面遷移を伴わないWebアプリケーションのことをSPA (Single Page Application) などと呼ぶ
282+
1. この技法をAsynchronous JavaScript + XMLの頭文字をとってAjax (エイジャックスと呼ぶようになった。
283+
3. StrutsやRuby on Railsはサーバサイド(バックエンド)側でリクエストを処理して画面も生成するというようなスタイルが中心だった。しかしAjaxが人気を集めるようになるとクライアント(フロントエンド)側で画面描画をすべて行い、バックエンドにはAPIサーバのみを置くというスタイルが主流になっていく
284+
1. 画面遷移を伴わないWebアプリケーションのことをSPA (Single Page Applicationなどと呼ぶ
282285
2. このスタイルが定着すると、デスクトップアプリケーションと比較しても遜色ないUIのWebアプリケーションが当たり前のように期待されるようになっていった
283-
3. 要求の高度化に応えるため、フロントエンド側のフレームワークが非常に速いペースで開発されているのが今日の状況である。人気の出たフロントエンド・フレームワークとしてはReact (Facebook)、Angular (Google)、Vue.js (Evan You)などがある
286+
3. 要求の高度化に応えるため、フロントエンド側のフレームワークが非常に速いペースで開発されていった。人気の出たフロントエンド・フレームワークとしてはReact (Facebook)、Angular (Google)、Vue.js (Evan You)などがある
287+
4. 最近はフロントエンド・フレームワークの開発も落ち着きつつある
284288

285289
### Node.js
286290

@@ -295,8 +299,8 @@ Perlから始まり、ここまで出てきたJavaやRailsは基本的に同期
295299

296300
![apache_railes](./apache_rails.drawio.png "apache_railes")
297301

298-
しかしインターネット利用者に増加にともなってWebサービスへのアクセス量も増え、プロセスのforkやスレッドによる処理モデルの限界が表面化してきた。特にプロセスの場合は1サーバあたりで起動できるプロセス数には限界がある他、プロセスを作るコスト(メモリ消費など)が無視できなくなってきたのである
299-
(C10K問題と呼ばれる)
302+
しかしインターネット利用者に増加にともなってWebサービスへのアクセス量も増え、プロセスのforkやスレッドによる処理モデルの限界が表面化してきた。特にプロセスの場合は1サーバあたりで起動できるプロセス数には限界がある他、プロセスを作るコスト(メモリ消費など)が無視できなくなってきた
303+
(いわゆるC10K問題)
300304

301305
::: tip
302306
たとえば32bit環境のlinuxサーバでは、プロセスの作成上限は管理番号(PID)の上限となる32768になる。
@@ -317,7 +321,7 @@ Node.jsの中でリクエストを並列に捌けるためWebアプリ用にプ
317321

318322
開発スタイルの特徴としては以下が挙げられる。
319323

320-
- フロントエンド開発と同じJavaScriptで書けるので、1サービスを作るのに複数の言語を扱わなくてよくなる
324+
- フロントエンド開発と同じJavaScriptで書けるので、プロダクトを作るのに複数の言語を扱わなくてよくなる
321325
- 豊富なライブラリやツールの選択肢がある
322326
- 反面EventDrivenな実装はコードが複雑になりがちで、どちらかというと小規模な実装向け
323327
- TypeScriptによる型の導入やasync/await記法の導入などで改善されつつはある
@@ -363,10 +367,11 @@ RubyやPython、Javaなどのように実行環境をインストールする必
363367

364368
### その他...
365369

366-
- Haskellなどの関数型言語が流行りそう?
367370
- Rustはいい言語だが書くのが難しく、どちらかというとOSなどのシステムプログラミング向け(と思ってる)
368371
- Rustのメモリ管理はGC(ガベージコレクト)を起こさないためのもの
369372
- Webアプリの実行環境はある程度メモリやCPUを富豪的に使えるため、書きやすさを優先してGoやRuby, JavaなどGCのある言語が使われる傾向にある?
373+
- 昨今はAIプログラミングが大前提の時代に突入しつつある
374+
- AIに特化した言語やフレームワークが登場する?
370375

371376
## アプリケーションプログラミングインタフェース(API) の色々
372377

0 commit comments

Comments
 (0)