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

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

新規登録して質問してみよう
ただいま回答率
85.50%
unicorn

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

Go

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

Java EE

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

サーバ

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

2回答

5883閲覧

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

jimyo

総合スコア243

unicorn

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

Go

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

Java EE

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

サーバ

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

4グッド

3クリップ

投稿2017/12/08 10:31

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

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

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

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

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

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

tatsukich39, miyabi-sun, yohhoy👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

環境構築のしやすさ

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

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

標準ライブラリ

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

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

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

投稿2017/12/12 04:59

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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等の登場でコンテナ運用に関して皆目を向けているのも追い風でしょう。

投稿2017/12/08 12:20

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問