質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.13%

  • サーバ

    666questions

    サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

  • Tomcat

    465questions

  • Go

    370questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • Java EE

    333questions

    Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

  • unicorn

    72questions

    Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Node.jsやGo言語でアプリケーションサーバー必要でないのはなぜでしょうか?

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 404

jimyo

score 206

普段Java EEを使ってアプリケーションを書いています。
Javaで書かれたサーバープログラムの場合Tomcatなど、Java EEだとWebSphereやGlassfishなどのアプリケーション・サーバー上にデプロイして動かすことになると思います。
RubyにもUnicornやThinなどがあると思います。

不勉強で申し訳ないのですが、私はずっと「サーバープログラムを動かすためにはアプリケーションサーバーが必要」だとばかり思っていました。
先日Node.jsの勉強を初めたのですが、Node.jsやGo言語にはアプリケーションサーバーがなく、ポートのlistenなどの処理を自分で書いて実行するものだと知りとても驚きました。

これを知ったとき、「デプロイが簡単そうだ」「処理が追いやすくてわかりやすい」など良い印象ばかり感じたのですが、同時に、「アプリケーションサーバーがなくて大丈夫なんだろうか」と疑問に思っています。

なんとなく自分の中で「アプリケーションサーバーがいい感じに処理していてくれている」という安心感があるため、いままでアプリケーション・サーバーが担当していた部分を自分で書くということに(この認識があっているのか心配ですが・・・)不安を感じています。(リッスンの仕方やメソッドの呼び方など)

なぜNode.jsやGo言語にはアプリケーション・サーバーが必要ではないのか、あるいは、なぜJavaやRubyではアプリケーション・サーバーが必要なのか教えていただきたいです。

また、アプリケーション・サーバーが存在することのメリット・デメリットもわかる方がいたら教えてほしいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+4

時代が変わって来て変化への対応が求められる様になってきたからです。

Java のアプリケーションサーバが流行り始めた 1990 年代後半から 2000 年前半にかけては、リッチなマシンリソースを手に入れるのも難しく、それに加えて Java はリソース食いと悪評もありました(今でも変わりませんが)。アプリケーションサーバを導入するのは今でこそ簡単になりましたが昔は手間で、マシンリソースが足らなくなったら別のサーバを用意してアプリケーションサーバをインストールし、Java アプリケーションをデプロイして来ました。勿論サーバが起動した後もこまごまとしたチューニングも必要でした。しかし時代も変わりリッチなリソースのマシンを手に入れやすくなったと同時に、即時性も求められる事になりました。

 環境構築のしやすさ

アプリケーションーサーバが持っていなかった物を Go や node は持っています。Go であればアプリケーションのバイナリ1つをコピーすれば良いですし、node であれば node のランタイムこそ必要ですが、アプリケーションが格納されたフォルダをそのまま別の環境に持っていけば動くのです(さすがに同じOSに限ります)。もちろん Java にも war という仕組みはありますが、その引っ越し先のサーバにもアプリケーションサーバが構築されている必要があります。

Java はマルチプラットフォームをウリにしていましたが、Go であれば Windows から Linux の実行バイナリを生成する事も出来ます。

 標準ライブラリ

Java は Servlet API という仕様だけを策定し、サーバやミドルウェア自体はサードパーティが実装するという方法を取りました。それはそれで良いデザインなのですが、サードパーティの実装差異により開発者が苦しめられる事もしばしばありました(今でもありますし先日もありました)。またアプリケーションサーバのバージョンが上がると、そのアプリケーションサーバで動くアプリケーション全てに影響が出る事もありました。非推奨の API を使っていた事で対応を同調しないといけないといった事もしばしばありました。Go や node はオフィシャルから標準ライブラリとしてウェブサーバを提供する事で、こういった問題を回避しています。

 スケールアウトのしやすさ

最近のウェブサービスではマイクロサービスという、システムを複数のサービスの集合として作る事が一般的になってきました。いざユーザ数が増えてきたり負荷が増大してきた時に、小さく分けられたサービスを新しく増やしてスケールアウトする事で、変化に対応しやすい様にする為です。始めは小さく、後に大きくといった事を行うのがマイクロサービスです。アプリケーションサーバの場合はスケールアップが一般的で、コストも掛かります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

単純にNode.jsとGo言語はシンプルな設計思想だからだと思いますよ。
Node.jsはJS譲りのイベントループを利用した怠惰なリクエスト待ちを実現してくれますし、
Go言語はGoルーチンという低コストでスレッドを発行出来る機能で並列処理が書きやすいです。

この辺が追い風になってC10K問題をあっさり解決してくれます。
超エコで超高速なやつらの性能比較: Go vs Node.js (vs Vert.x) - Qiita

不安を感じています。

当然Node.jsやGo言語も書き捨てるのではなく、
ある程度責任を持ったサーバーを運用するのであればどうしても行数が必要になります。

フレームワークがあるのでその辺は誤差だよ誤差。
Javaでサーバ建てる時もフルスクラッチで書いたりしないでしょ!

アプリケーション・サーバーが存在することのメリット

ApacheやNginXは静的コンテンツ配信やリバプロ目的でまだまだ使われるでしょう。
それ目的の為に作られたアプリは強いので餅は餅屋です。
1行たりとも書かなくても高速に動くのに、動作を保証してくれるのは強すぎるでしょう。


マイクロサービス的な思想が最近強いですね。
Docker等の登場でコンテナ運用に関して皆目を向けているのも追い風でしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.13%

関連した質問

  • 受付中

    言語を使い分けてる方に質問です

    どういう時にどういう言語を使いますか? また、その理由も教えていただけるとうれしいです。 場合によっては仕方なくその言語を使っていたりするとおもいます。

  • 解決済

    (Java).warファイルと.earファイルの違いは?

    Java初心者です。 .warファイルと.earのファイルの違いをどなたか教えていただけませんか?

  • 解決済

    IoTの仕組みについて

    お世話になってます。 今後、全てのものがインターネットと繋がる・・・という事が速いスピードで移り変わってくるものだと思います。 とても興味のある事ですが、お恥ずかしい質問だとは

  • 解決済

    サーブレットが動かない

    アプリケーションとサーブレットを使ったシステムの開発をしています。 アプリケーションからサーブレットにPOSTを使って呼び出そうと試行錯誤しているのですが、サーブレットが動きません

  • 受付中

    Eclipseで開発時のコンテキストルート名変更方法

    現在、Eclipse4.4.2(Luna)とWildFly8.2.1環境でJAVAのWebアプリケーションを開発しています。 WEBアプリは動的Webアプリケーションプロジェクトと

  • 受付中

    SNSアプリケーション制作に当たって

    初心者な質問で 申し訳ないのですが 現在、SNSでメッセージのやり取りが 可能なWebサービスを開発しようと 試みています。 そこで、質問なのですが SNS

  • 解決済

    Javaservletを実際のWebサーバーへのデブロイする方法につきまして

    会社が用意してくれたWebサーバーへ開発したJava servlet並びにJSPをアップしたいと考えております。 使っている開発環境は下記の通りです ・Tomcat v8.

  • 受付中

    tomcatのダウンロード

    tomcatの 6.0.53 パッケージ情報 については、READMEファイルを参照して ください。すべてのディストリビューションに含まれるものについて説明します。 バイナ

同じタグがついた質問を見る

  • サーバ

    666questions

    サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

  • Tomcat

    465questions

  • Go

    370questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • Java EE

    333questions

    Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

  • unicorn

    72questions

    Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。