Posts filed under ‘Application Server/GlassFish’
JavaOne 2008 報告会開催
大渕さんのブログでもアナウンスされていますが、
今月末の5/31(土)にJavaOne 2008 報告会がSunの
神宮前オフィスで開催されます。
昨日の夕方に登録開始して既に130名以上の登録が
あるようです。
何名で定員締め切りか私もしらないのですが、
現時点でまだ、申し込みが可能でしたので、
御時間に都合がつく方は是非御参加下さい。
Masako Ofuchi’s Weblog
登録〆切迫る – JavaOne 2008 報告会 –
● 参加のお申し込みはこちらから
PS.
当日、私も受付を行っております。
皆様の御来場を御待ちしております。(^_^)
Grizzlyの概要 2 : Java New I/Oで実装されたサーバ
さてさて、今日も引き続きGrizzlyを説明したいと思いますが、
その前に、やはりJava New I/Oについて理解して頂かなければ
本当の意味でGrizzlyを理解していただけませんので、Grizzlyの
ソースコードを追う前にJava New I/Oについて簡単に復習して
おきたいと思います。
ただし、ここではほんの概要程度の説明ですのでちゃんと
理解されたい方は別途Java NIOについて説明されている記事を
読んで理解してください。
※ 本エントリの一番最後にJava New I/Oを学ぶことができる
参考URLを示しています。
Java New I/Oでノンブロッキングサーバの実装:
前回、Java New I/Oを使って実装されたサーバは、今までの
マルチスレッド型のBlocking I/Oを使用して実装されたサーバより
新規スレッドを作成する必要がなくスレッド数を少なくすることが
できると説明しましたが、では具体的にどのようにして実装されているかを
説明致します。

まず、Non Blocking I/Oを理解する上で必要なJava New I/OのAPIを紹介します。
チャネル:
チャネルとは、ハードウェアデバイス、ファイル、ネットワークソケットのほか、
個別の入出力操作を実行できる接続を表します。
Non Blockingにできるチャネルは、java.nio.channels.SelectableChannelクラスを
継承したサブクラスで、java.nio.channels.SocketChannelや
java.nio.channels.ServerSocketChannelクラスがあります。
このクラスのインスタンスメソッドで、configureBlocking(false)を
実行するとチャネルをNon Blockingモードに調整することができます。
例えば、ServerSocketChannelを使ってチャネルをノンブロッキングモードに
する為には下記のようにserverChannel.configureBlocking(false)を記載します。
|
serverChannelというチャネルをNon Blockingモードに設定した後、
Selectorのインスタンス selector に対してregister(登録)します。
実はこの行がJava New I/Oの中でとても重要な箇所です。
今までのマルチスレッド型のサーバの場合、java.net.ServerSocket.accept()メソッド
を呼び出してソケットのアクセプト処理を行っていましたが、Java New I/Oでは
java.nio.channels.ServerSocketChannel.accept()メソッドでアクセプト処理を行います。
この際、ServerSocketChannel.accept()メソッドはNon Blockingモードに設定されている場合、
保留されている接続がない場合、直ちにnullを返します。
つまりServerSocket.accept()のように新たなクライアントからの接続がくるまで
待ち続けることはありません。
しかし、クライアントからの接続を待たないということはサーバ側ではどのタイミングで
アクセプト処理を行えばよいのかが分からなくなります。
そこで、利用できるチャネル(接続)を取得する為にセレクタ(Selector.select())を使用します。
チャネルをセレクタに登録しておき、セレクタの中で利用できるようになったチャネルを
SelectionKeyとして取得して入出力操作を行うことができます。
セレクタには、複数のチャネルを登録することもでき、
複数の入出力操作を同時に行うことができるようになります。
例えば、下記にかんたんなエコーサーバをJava NIOを使用して
作成してみましたが、下記ではクライアントからの接続毎に
スレッドを生成していないことが御分かりいただけるかと思います。
また、マルチスレッド型のサーバのようにコネクション毎に新規スレッドを
生成していないことがわかります。
例:Java New I/Oで実装したサンプルエコーサーバ
|
このように、Java New I/Oを使用して作成されたサーバは、接続毎に
新規スレッドを作成しなくてもよくなるため、既存のサーバ実装とは
特に大量のアクセス等が発生した際に大きな差がでてきます。
例えば、メモリの消費量も少なくて済むので高負荷時になればなるほど
使用するサーバリソースが大きく変わってくるかと思います。
次回は、Grizzly 1.0.19のソースコードを読む際にどこから見ていけばよいのか、
また、Grizzly 1.0.19の中でどのようなクラスが重要なのか等
ソースコードを見るために必要な情報を紹介したいと思います。
※ Grizzlyのソースコードを読む前に、上記のSelector,SocketChannel
ServerSocketChannel,SelectionKey等のクラスを理解しておいてください。
Java New IOの参考記事へのURL:
● 横河電機の櫻庭さんによるIT Proの記事「New I/Oで高速な入出力」
● TECHSCORE (5. ノンブロッキングチャネル)
SDC 連載記事 第3回:クラスタと負荷分散 (1)
SDC SQUARE 2008年5月号がリリースされました。
JavaOneのレポートの他、4月に開催されたイベントの情報も記載されています。
■ CommunityOne + 2008 JavaOne Conference テクニカルレポート
■ 4 月開催のイベントレポート
また、GlassFish連載記事では第3弾として「GlassFishのクラスタ構成や負荷分散」
について、私の所属するグループの吉田さんにとても詳しく書いて頂いています。
#GlassFishを複数台のマシンで構成する場合、どのようにして設定情報等を
#共有するのかについて詳しく説明されていますので、是非一度御確認ください。
■ SDCのGlassFish連載記事 第3回:クラスタと負荷分散(1)
ちなみに、吉田さんには高橋さん、岡崎さんと共に来月のイベントに登壇いただく予定です。
(私もしゃべるかも?!)
イベントの開催日時:2008年06月12日(木)
イベント情報:IT サービス設計の新しい方法論
また、SDCの連載記事ではGlassFish以外にも新しい技術が紹介されています。
『今月も片貝さんかな?!』によるNetBeans:第4回:ソースコードのバージョン管理や
町田さんによるSun SPOT:第4回:入出力ポートにセンサーやアクチュエータを取り付けてみよう
の記事もありますので、是非ご覧ください。
Grizzlyの概要 : C10K問題に対応するGlassFish(Grizzly)
さて、おまたせ致しました。
本日より、JJUGで発表したGrizzlyについて紹介したいと思います。
まず、Grizzlyって聞いたことありますか?
「GrizzlyはGlassFishコミュニティの中のサブプロジェクトの1つで
JavaのNew I/Oを使って記述された汎用的なネットワークサーバエンジンです。」
Project Grizzly :
https://grizzly.dev.java.net/
Project Grizzlyによって開発された成果物(ネットワークサーバエンジン)は GlassFishとは独立して単体で使用することができます。また、Grizzlyは独自の進化を遂げていっています。現在、Grizzlyの最新バージョンは1.7.3.1です。
今回紹介するGrizzlyは少しバージョンが古いのですが、GlassFish v2.x系にバンドルされているGrizzly 1.0.x(1.0.19)について紹介します。
●Grizzly誕生の背景
まず、Grizzlyのできあがった背景について説明します。Grizzlyは元々GlassFishのHTTPをハンドリングするHTTPサーバを開発するプロジェクトとして開始しました。それまでのSunのアプリケーションサーバは、TomcatのCoyoteを内部で使用していたのですが、GlassFishではCoyoteを使用せずにJavaのNew I/Oを使用して実現するHTTPサーバとして実験的に作成を開始しました。
(Grizzly1.0.19でもHTMLの解析等で一部apacheのAPIを使用してます)
そして開発を進めて行くに従い、Grizzlyの潜在能力の高さが判明してき、HTTPだけではなく、他のプロトコルも扱うことのできる汎用的なネットワークサーバエンジンになりえることが分かってきました。その結果、現在ではHTTP以外にTCP,UDPといった下位のレイヤープロトコルを始めとし、TLS,FTPやSIP等といったマルチプロトコルに対応するハイパフォーマンスなネットワークサーバエンジンになっています。ですので、仮に開発者が新たに独自のネットワークサーバを構築する必要がでてきた場合、GrizzlyのAPIを一部拡張して実装して頂くことでハイパフォーマンスな独自ネットワークサーバを構築することも可能になっています。
例えば、GrizzlyのHTTPサーバエンジン以外の使用例として独自のsyslogサーバを構築することも可能になります。Grizzlyの背景とできることは上で説明しましたが、何故今ここでGrizzlyという新しいネットワークサーバエンジン(フレームワーク)が登場したのでしょうか。以下ではWebサーバの実装における過去の歴史とGrizzlyが登場した理由を説明します。
●Web サーバの実装における歴史
Webサーバは古くはCERN,NCSA等といった所で作成されていましたが、Apacheでhttpdが作成された後はApacheにシェアを奪われていきました。こういった古いWebサーバや初期のApache httpdはプロセス起動型のサーバの実装になっていました。

このプロセス起動型のサーバではHTTPクライアントであるブラウザからリクエストがくる度にhttpdのプロセスを起動しリクエスト数が多くなると子プロセスをfork()して処理を行っていました。当時のWebサーバは今程リクエスト数も多くなく、FastCGI等も無いこの時代にはサーバサイドで実行するプログラム(Perl,C等のCGI)もfork()して子プロセスで実行していました。
しかし、プロセスのfork()はシステム(OS)に対して多大な負担を掛けます。そこで登場したのがマルチスレッド型のサーバです。

マルチスレッド型のサーバでは単一のプロセス内でリクエスト毎にスレッドを起動し、各スレッドでHTTPの処理を行うことで、子プロセスを起動するよりシステムに対する負担は大幅に軽減するようになります。この頃になり、マルチスレッドサーバ上でサーバサイドで実行するプログラムとしてServletが脚光を浴びました。しかし、実際のWebサーバの実装は上に説明した程簡単ではありません。上記の図中にスレッドの起動プログラム例を記載していますが、Webサーバのように大量のリクエストを扱うようなプログラムの場合、accept()の処理は負荷はあまり掛からないのですが、スレッドの起動はaccept()の処理に比べ非常に負荷が高くなってしまいます。この状況ではパフォーマンスにボトルネックが生じます。

そこで、スレッドの起動に関する問題を軽減する為に、実際のWebサーバではaccept()処理とスレッドの処理を分離し、間に接続キューを設けることでaccept()の処理を素早く受け流すことができるようになります。(SunのWeb ServerはC++で上記のように実装)そして、実際にHTTPの処理を行うワーカスレッドが接続キューからコネクションを取得し、HTTPの処理を行うようになります。他のサーバの実装を細かく見たことはありませんが、恐らく現在のWebサーバの実装は似たような実装になっているのではないかと思います。
●マルチスレッドサーバの問題 (Blocking I/O型サーバ)
ソケット通信を行うプログラムを実装する場合、accept()やI/Oのread(),write()等を使用しますが、これらのメソッドは処理をブロックします。

例えば、ServerSocket#accept()メソッドはクライアントが接続するまで待ち状態になり、クライアントからの接続があって初めてメソッドの処理を終了します。複数のクライアントからの接続を処理できるようにする為には、サンプルのようにスレッドを生成し実際の処理は別スレッドで行うように実装します。このような実装の場合、接続してくるクライアントの数が増えれば増える程、大量のスレッドが生成されることになります。そして、スレッドが大量に生成される場合、大量のメモリが必要になってきます。下記のグラフではJavaでスレッド数を増やしていった場合に実際に必要なスレッドのスタックサイズを現していますが、これによると10,000スレッドを同時に生成した場合、約10Gバイトのメモリが必要になっています。また、2万スレッドになると約20Gバイトのメモリが必要になっていることがわかります。このように、単純にスレッドを増やしていくモデルのサーバはアクセス数が増えれば増える程大量のメモリを消費していくことがわかります。

●C10K問題を解決できるサーバ (Non Blocking I/O型サーバ)
GlassFish(Grizzly)は上記の問題を解決するためにNon Blocking I/Oを使用して実装が施されています。Non Blocking I/Oを使用するとスレッドの作成数を減らすことができます。

実際には、Java NIOではServerSocketChannel#accept()メソッドでaccept処理を行いますが、この処理はブロックしません。仮にこのメソッドが呼び出された時にクライアントからの接続がない場合は、すぐにnullを返します。ServerSocket#accept()メソッドのように処理をブロックしないので、クライアントのリクエスト毎に新たなスレッドを生成する必要もなくなります。言い換えると、ServerSocketChannel#accept()を呼び出した元のスレッドで引き続き処理を続けることができるようになります。
※ つまり複数のリクエストを処理するために、接続毎に新規スレッドを生成しなくてもよいようになります。
Grizzlyの開発者の1人であるJean-Francoisは次のように述べています。
「Grizzlyではたった30スレッドで10,000の接続を捌くことができます。」
This strategy prevent one thread per request, and enable Grizzly to server more that 10 000
concurrent users with only 30 threads.
●Asynchronus Request Processing(ARP)
さて、GrizzlyはJava New I/Oで実装されているだけでもすごいのですがさらに、ARPも実装されています。ARPはComeのアプリケーションや、ビジネスプロセスの処理にとても時間が掛かるような場合、つまり長時間接続を保持しなければならないアプリケーションの動作も実現できるように実装されています。APRも又1つの接続辺り1スレッドを消費しないように実装されているため、今までのマルチスレッドサーバ、Synchronus Request Processingに比べComet等のアプリケーションを実行する環境としても最適です。
●まとめ
Grizzlyは汎用的なネットワークサーバエンジンです。独自にサーバを構築する際はGrizzlyのフレームワークを再利用することでハイパフォーマンスな独自サーバを構築することが可能になります。GrizzlyはJava NIOで実装されARPに対応しているのでComet等のアプリケーションの実行環境としても最適です、そしてパフォーマンスも良いのです。GlassFish(Grizzly)を使用して新しい先進的なアプリケーションを作成してください。

最後に、今回はGrizzlyの概要について紹介しました。GlassFish(Grizzly)が何故パフォーマンスがよいのかの概要を掴んでいただけたのではないかと思います。次回は、さらに深くGrizzlyの内部の実装を知りたい方、もしくはJava NIOで実装されたサーバに興味のある方を対象に、Grizzlyのソースコード(Grizzly 1.0.19)の見方を紹介します。
GlassFish SDC連載記事4月号のアップデート情報
先月のSDCの連載記事で下記の記事を書きましたが、
連載記事のアップデート情報をPDF資料にまとめ、
ダウンロードできるようにしましたので、紹介します。
アップデート情報の入手はこちらから
本資料はSDCの記事で紹介したドメインの構成例を
具体的にコマンドライン、もしくは管理コンソールから
実行した例を示しています。ですので是非連載記事と
併せてご覧頂ければと思います。
SDC連載記事:
GlassFishではじめるアプリケーションサーバのかんたん構築
第2回:アプリケーションサーバの管理の基本
http://sdc.sun.co.jp/java/series/glassfish/200804.html
GlassFish Enterprise Server 日本語マニュアル公開
皆様、嬉しいお知らせです。
GlassFish Enterprise Serverの日本語のマニュアルがdocs.sun.comに
公開されていました。
こちらの資料は私が所属する部署の方々による日本語レビューが済んでいます。
#すいません、私は当時発表続きでレビューに参加できていません。(^_^;)
● Sun Java System Application Server 9.1管理ガイド(日本語)
● Sun Java System Application Server 9.1 高可用性(HA)管理ガイド(日本語)
● Sun Java System Application Server 9.1配備計画ガイド(日本語)
● Sun Java System Application Server 9.1クイックスタートガイド(日本語)
また、GlassFish日本語コミュニティの翻訳の方もかなり進んでいます。
中でも「カナさん」の御協力はすごいです!!
カナさんに訳していただいたコンテンツだけで下記のコンテンツがあります!!
カナさん、御忙しい中本当にありがとうございます!!!!
GlassFish 日本語翻訳プロジェクトについての進捗状況等の詳細
マイグレーションツールオンラインヘルプ:
● マイグレーションツール概要
● インストールと設定
● マイグレーションするアプリケーションの準備
マイグレーションガイド:
● 標準でない JNDI 名を使用するローカル EJB 参照
● WAR ファイル最上位にパッケージされるクラス
● Facelets の利用
● JBoss EJBQL != Glassfish(J2EE Spec) EJBQL
● GlassFish Cache でエンティティとして参照される組み込みオブジェクト
● GlassFish キャッシュリフレッシュ
JJUG イベントの発表資料(Grizzly)
先日、開催されたJJUGのイベントで発表時に使用した資料を公開します。
恐らくJJUGでも同様の資料が公開されるかと思いますが、どちらから
リンクが貼られるかが分からないので念のため、自分のブログからも
取得できるようにしておきます。
本資料では、Grizzly1.0.x系の内部実装について詳しく紹介しています。
Grizzlyに興味のある方、Java NIOについて興味のある方は、
是非ご覧ください。
資料はこちらから
PS.
説明が無いと資料の内容を理解して頂くことは難しいとは思いますが、
説明は後日ということで。(^_^;)
JJUG クロスコミュニティカンファレンスのアップデート情報
さて、4/30にJJUGのCCCで発表することは以前にも
御伝えしましたが、発表する内容が固まってきました。
JJUG Cross Community Conference
今回は開発者向けのイベントですので、開発者に
対するメッセージが出せればと思い新たに資料を
書きおこしました。
ですので、今まで聞いて頂いた方も是非御都合があえば
御越し頂ければと思います。
概要を紹介しますと、タイトルが
「GlassFishで一歩進んだ開発をしてみませんか」ですので
一応ざっとどのようなアプリケーションを作成、動かすことが
できるのかについて紹介したいと思います。(約10分程)
#この前半部分は、今まで聞いたことのある方は重複する
#内容になるかと思います。
前半が終わった後残りは、Grizzly祭りにしようと思っています。
対象として聞いて頂きたい方は、下記のような方に聞いて
頂ければ幸いです。
● Cometのアプリケーションをかんたんに作成したい方
● C10K(クライアント1万)問題について知りたい方
● Java NIOのnon-blocking I/Oについて知りたい方
● 何故GlassFish/Grizzlyの実装が先進的か知りたい方
● GlassFishのHTTPのハンドリング部分を詳しく聞きたい方
● Java New I/Oでサーバプログラムを記述する方が参考にされる場合
一歩進んだ開発ということでは、
Cometのサーバ側のアプリケーションをかんたんに
POJOで実装できるようになる、Grizzletについても紹介
したいと思っております。
また、若干こじつけですが、Grizzlyの実装から
Java New I/Oでサーバプログラムを実装する際の注意点の紹介と
いかにしてGrizzlyが対応しているのかについても若干紹介します。
PS.
今回来て頂く方は、Grizzlyのソースコードをどこから見て行けば
よいのか指針が得られるのではないかと思います。
また今回、アプリケーションサーバの管理系については一切
説明いたしません。
管理者の方は今回対象としておりませんが、
仮にGrizzlyのソースコードから原因究明等を
将来的に行いたい、もしくは内部実装を知りたいという方は
是非、御越しいただければと思います。
GlassFishダウンロード
java.netへの登録とGlassFish MLへの登録方法
先日、GlassFishのwikiサイトの翻訳プロジェクト開始に
ついてアナウンスさせて頂きましたが、
現在、色々な準備を行っています。
日本語でディスカッション可能なメーリングリストとして
discuss_ja@glassfish.dev.java.netが存在します。
この翻訳プロジェクトで上記のメーリングリストを
使用することに致しました。
今日は、discuss_ja@glassfish.dev.java.netのメーリング
リストへ参加する為の手順について紹介します。
手順が多くてすいません。(^_^;)
手順1: java.netアカウントの登録
手順2: ユーザ名とメールアドレスの登録
手順3:登録メールの確認
手順4:パスワードの登録
手順5:ログイン状態の確認
手順6:メーリングリストのページへ移動
手順7:discuss_ja@glassfish.dev.java.netの購読
手順8:購読の確認1
手順9:購読の確認2
手順10:空メールの送信
手順11:メーリングリスト購読完了
手順1: java.netアカウントの登録
まず、はじめにjava.netのアカウントを作成して
頂く必要があります。java.netのアカウントは
下記のURLにアクセスして作成します。
https://www.dev.java.net/servlets/Login?cookieCheck=on
上記のURLにアクセスすると下記の画面が表示されます。
ここで、「アカウントの登録」のリンクを押下してください。

手順2: ユーザ名とメールアドレスの登録
「アカウントの登録」リンクを押下すると下記の画面が表示されます。
ここで、「ユーザ名」と現在御使いの「メールアドレス」を記入して
「登録」ボタンを押下してください。

手順3:登録メールの確認
「登録」ボタンを押下すると、入力したメールアドレスに対して
下記のようなメールが送信されます。
メール中に記載されているURLにアクセスして下さい。

手順4:パスワードの登録
メールに記載されているURLにアクセスすると下記の画面が表示されます。
ここに、アカウントに対する「パスワード」を入力して「パスワードの変更」ボタンを
押下してください。
※ 文字化けは無視してください。(^_^;)

手順5:ログイン状態の確認
「パスワードの変更」ボタンを押下すると、java.netに自動的にログインされます。
画面右上に、作成したアカウントでログインされているか確認してください。
「例:Logged in yosshi2008」

手順6:メーリングリストのページへ移動
java.netにログインされた状態で、GlassFishのサイトへ移動してください。
https://glassfish.dev.java.net
移動した後、画面右のメニュー中より「Mailing Lists」のリンクを押下して
下さい。すると下記の画面が表示されます。

手順7:discuss_ja@glassfish.dev.java.netの購読
メーリングリストのサイトへアクセスした後、ブラウザをスクロールして、
discuss_ja@glassfish.dev.java.netを見つけてください。
メーリングリストを見つけた後、「購読」ボタンを押下してください。
※ この「購読」ボタンはjava.netにログインした状態でなければ表示されません。
「購読」ボタンが表示されない場合は、java.netへログインした後に
アクセスしてください。

手順8:購読の確認1
「購読」ボタンを押下すると下記の画面が表示されます。
「購読のリクエストが送信されました。」というメッセージが表示されています。

手順9:購読の確認2
java.netで登録したメールアドレスに対してメッセージが送信されていますので、
メールの内容を確認してください。
内容を確認すると、下記のメールアドレス宛に空メールを送ってくださいと
記載されています。
空メールの送信先:
discuss_ja-sc.aaaaaaaaaa.bbbbbbbbbb-******=****.****@glassfish.dev.java.net

手順10:空メールの送信
メールに記載されている、アドレスに対して空メールを送信してください。

手順11:メーリングリスト購読完了
空メールを送信すると下記のようなWELCOMEメッセージが返信されます。
メッセージを受信すると購読手続きが正常に完了していますので、
後は、discuss_ja@glassfish.dev.java.netで日本語コミュニュケーションが
可能となります。

Participation Ageの到来です!!
是非皆様も御参加ください。
GlassFish日本語ディスカッションメーリングリストへようこそ!!
Sun Business .Next 2008(GlassFish Community)
先週、金曜日はSun Business .Next 2008が六本木ミッドタウンで
開催されました。その時の写真の一部を紹介します。
私は、山口さん、片貝さんとコミュニティトラックで発表させて
頂きましたが、とても多くの方に御参加頂きました。
雨の中、ご来場いただきました方、ありがとうございました!!
金曜日はコミュニティトラックということで、GlassFishコミュニティ
について話をしたので、技術的なことは話をしませんでしたが、
4/30に開催されるJJUGのクロスコミュニティカンファレンス2008Spring
では、今までよりも技術的な話をしたいと思っております。
今、考えているのはGrizzlyの辺りとかCometの辺りをしゃべりたいと思ってます。
何故、GlassFish上でCometのアプリケーションを動かすとよいのか等々。。
あまり現時点で詳しく書けませんが、開発者向けのイベントですので、
開発者の方々に向けたメッセージが御送りできればよいなと思ってます。
そういえば、
技術評論社さんにもJJUGイベントの御紹介を頂きました。
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |






