この記事は機械翻訳されたものです。

Windows Azure の詳細

Windows Azure における Node.js の実際のシナリオ (機械翻訳)

Bruno Terkaly
Ricardo Villalobos

コード サンプルをダウンロードする

Bruno Terkaly, Ricardo Villalobos「すべてが場合、ハンマー、人気のある引用すべてが釘のように、見える」確かに、ソフトウェア アーキテクチャに適用されます。 最高の開発者は、しかし、彼らだけでなく即座にビジネス要件だけでなく、拡張性の高い、保守、拡張、再利用可能なソリューションの結果を満たすソリューションのエンジニア リングすることができますので、プログラミング言語やプラットフォームさまざまなフレームワークを理解します。 Node.js のシーンには 3 年前、スケーラブルなインターネット アプリケーションをサポートするサーバー側のソフトウェア システムを作成するには、まだ別のツールを提供するバースト。 すべての開発ツールのような Node.js 魔法のハンマーではない、それは権利であるかを決定する手のためのソリューションに適合する前に、その機能を完全に理解する必要があります。

Node.js に新しいしている場合に、JavaScript v8 エンジン Google エンジンに基づくスケーラブルなネットワーク アプリケーションの構築のためのプラットフォームです。 オーケストレーションで示すように、非同期/イベント-コールバック/非ブロッキング アプローチを使用して並列に実行中のタスクのことができますは、シングル スレッド io イベントのモデルを提供します図 1。 Node.js 大容量メモリ フット プリントを必要とせずに複数の接続をサポートする軽量サーバー見ることができます。

Node.js—Single-Threaded Model Based on an Asynchronous/Event-Callback/Non-Blocking Approach
図 1 Node.js—Single スレッド モデルの非同期/イベント-コールバック/非ブロッキングのアプローチに基づく

配置の観点から、Node.js のエンジンは、小さな実行可能ファイルに含まれている — 5 MB 未満-ことすることができますがインストールされている Windows、Linux、または Mac OS X で。 HTTP および TCP ポートをリッスンして、要求、またはファイル システムへのアクセスなど、いくつかの組み込みコンポーネントを含む、高度にモジュール化されたアーキテクチャを実装します。 強力なオープン コミュニティによって提供される、追加のモジュールは、ノード ・ パッケージ ・ マネージャ ・ ユーティリティ (npm) を使用して、必要に応じてダウンロードできます。 これにより、HTTP サーバーを可能な限り、5 行のコードを実行しています。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');}).listen(8080);
console.log('Server running on port 8080');

これは言っても、あるいくつかの重要な課題 Node.js 開発者が直面します。 最初に、それは 1 つのスレッドで実行中の非同期呼び出しに基づくプログラミング モデルを強制します。 これから、複数のスレッドにタスクを割り当てることができます従来のプログラミング パラダイム シフトです。 世話をされていない場合は、プログラマは、サーバーをブロックまたは予期しないコードの動作を作成するトラブルに得ることができます。 2 番目の課題のコールバックに関連しています。コードは扱いにくくなり、深い入れ子による管理が困難になることができます。 最後に、デバッグするは、特に複雑なシナリオでは単純ではないです。 各これらの課題を操作するためのアプローチがありますが、意識的な努力を取ると学習します。 Node.js が若いであることに注意してください。 幸いにも、強力なコミュニティがプログラマのヘルプとオンライン リソースに準備ができてよう howtonode.org

一日の終わりには、新しい技術を評価する最良の方法は現実の世界で問題が検出され、解決、です。 この記事では Node.js、展開プラットフォームとして Windows Azure を使用して 2 つの特定クラウド ベースのシナリオを提案する. あなたが既にクライアント側 JavaScript 開発者なら、言語の観点から実行して地面をヒットします。

[必須コンポーネント]

この資料に示すソリューションのテストを開始する前に、あなたはで見つけることができます Node.js Windows インストーラーをダウンロードしてください nodejs.org/download。 インストーラーは、2 つの主要なファイルが Windows プログラム ファイル フォルダーに配置されます。Node.js ランタイムは、node.exe、故宮は、サード パーティー製のモジュールをダウンロードすることができます。 Node.js ソリューションを Windows Azure に展開するため、ダウンロードに見つけることができます対応するコマンド ライン ツール windowsazure.com/en-us/develop/downloads。 ユース ケースに固有の前提条件は、各セクションに含まれています。

Node.js アプリケーションを Windows Azure の展開

Windows Azure では 8 つのマイクロソフトのグローバルなデータ センターのいずれかに展開するアプリケーションの 3 つのクラウド展開モデルを提供しています。仮想マシン (Vm)、クラウド サービスおよび Web サイトです。 最も適切な展開モデル スケール、コントロールと、必要な柔軟性のレベルに依存します。 多くのスケール、コントロールと柔軟性を支払う価格より多くの仕事が展開し、Node.js アプリケーションを維持に関与していることです。 Web サイト モデルは、ファイアウォール規則、仮想ネットワーク、Os についての心配から開発者を解放します。 当然のことながら、このオプションを選択すると、展開のきめの細かい制御を与えます。

すべての種類の単一の図表でシナリオをカバーすることが可能ではないにもかかわらず図 2 アプリケーションに必要なインフラストラクチャとソフトウェアのコンポーネントに基づいて、Node.js ソリューションを展開する場所を決定するための決定ツリーが表示されます。 我々 は現実世界の例この資料で Windows Azure 展開モデルを決定するのにそれを使用します。

Decision Tree for Deploying Node.js Applications to Windows Azure
図 2 決定木 Node.js アプリケーションを Windows Azure のデプロイ

現実世界のシナリオ 1:リアルタイム Web コミュニケーション間 HTTP クライアントとサーバー最初の例では、どのように Node.js の Web ブラウザーとチャット ソリューション、ソーシャル メディア、ニュースのティッカー、ビデオゲームなどの HTTP サーバーの間のリアルタイム通信を必要とするアプリケーションの理にかなっています。 伝統的に、開発者は、ロング ポーリングおよびストリーミングなど、別の長期的な接続メカニズムを使用して、このタイプの通信を達成しています。 最近では、HTML5 仕様は、単一の TCP 接続で全二重通信チャネルを提供します WebSockets という通信プロトコル含まれていますが、最も一般的な Web ブラウザーの最新バージョンでのみサポートされます。 Node.js アプリケーションは、複数の種類を含むトランスポートのサポート socket.io xhr ポーリングと呼ばれるサードパーティ製モジュールと WebSockets リアルタイム通信シナリオをサポートできます。 Socket.io に基づいて、イベント駆動型のアプローチ、サーバーと、Web ブラウザー クライアント間での図のよう図 3。 それでいるbit.ly/NlDOv7

Real-Time Communication Between Web Browsers and HTTP Servers Using Node.js
図 3 Web ブラウザーと Node.js を使用して HTTP サーバーの間のリアルタイム通信

基本的な流れは次のとおりです。

  1. Web クライアントは、サーバーに接続し、(WebSockets、XMLHttpRequest (XHR) ロング ポーリングまたはフラッシュのソケット) などの通信プロトコルに同意します。
  2. Web クライアント イベントに Node.js サーバーへの JavaScript は、socket.emit メソッドを使用して送信します。
  3. サーバーは、クライアントによってその socket.on 定義のいずれかで定義されている送信関数の名前を照合することによってイベントをキャプチャします。
  4. サーバーは、socket.emit メソッドを使用して、クライアントに応答または socket.broadcast.emit を使用してすべての接続されているクライアントにメッセージをブロードキャストすることができます。

これで示されている図 4図 5、ショー、サーバー側コードとクライアント側コードは、それぞれ。 コードは、単にすべて接続しているクライアントにメッセージをブロードキャストします。

図 4 サーバー側コードのリアルタイム通信を確立します。

// Include needed packages (socket.io and express)
var express = require('express');
var app = express()
  , http = require('http')
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);
// REPLACE BELOW var port = var port = process.env.PORT || 8080;
// Allow connections on port 8080, or the environment port number
var port = process.env.PORT || 8080;
// At the time of this writing, WebSockets is not supported
// in Windows Azure Web Sites, which will force socket.io
// to fall back to a different communication protocol
// Prevent potential problems by specifying one, in this case, xhr-polling
io.set('transports', ['xhr-polling']);
// Listen for incoming requests
server.listen(port);
// Redirect request to index.html
app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});
// When connected and sendmessage is called by client,
// broadcast data sent by one client to all connected clients
io.sockets.on('connection', function (socket) {
  // When the client emits 'sendmessage,' the following method is triggered
  socket.on('sendmessage', function (data) {
    // Message is broadcast to all clients
    socket.broadcast.emit('displaymessage', data);
  });
});

図 5 クライアント側コードのリアルタイム通信を確立します。

<html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script>
  // Initialize the socket connection
  var socket = io.connect();
  // Ask client (browser input box) to enter text      
  function sendMessage(){
    socket.emit('sendmessage', prompt("Message to broadcast?"));
  }
  // Displaymessage event received at all clients
  // display in alert dialog box
  socket.on('displaymessage', function(data){
    alert(data);
  });
</script>
</head>
<body>
<!—Client sends user input to node.js server through the sendMessage JavaScript function-->
<input type="button" value="Broadcast new message" onClick="sendMessage();">
</body>
</html>

ローカル アプリケーションのテスト

アプリケーションをローカルでテストする手順に従います。

  1. {ドライブ文字}://nodejs/ソケットと呼ばれるローカル フォルダーを作成します。
  2. 好みのテキスト エディターを使用して、server.js と呼ばれるファイルを作成します。
  3. 記載されているコード コピー & ペースト図 4 サーバー側。
  4. 同じディレクトリには、index.html というファイルを作成します。
  5. 記載されているコード コピー & ペースト図 5 のクライアント側。
  6. コマンド プロンプトを開き、ディレクトリ {ドライブ文字}://nodejs/ソケットに変更します。
  7. インターネットに接続している型故宮をインストール socket.io を確認してください。 これは必要な socket.io モジュールをインストールします。
  8. 型故宮を特急インストールします。 エクスプレス HTTP サーバー機能へのアクセスを簡素化し、socket.io と簡単に統合することができますモジュールです。
  9. ノードの server.js を入力します。
  10. WebSockets と互換性のある Web ブラウザーを開き、URL http://localhost:8080 を入力します。
  11. 2 番目の Web ブラウザー タブまたは同じ URL を参照ウィンドウを開きます。
  12. 最初のクライアントから送信されたメッセージは、サーバーに接続されている他のすべてのクライアントにブロードキャストします。

あなたのソリューションを Windows Azure に展開します。

決定木に基づく図 2、Windows Azure の Web サイトは、(Linux 必要とされていない; アプリケーションの良いオプション 追加コンポーネントの OS は必要ありません。 そして、ハイブリッド インフラストラクチャ ソリューションを実行する必要はありません)。 我々 は socket.io—we によって使用される通信プロトコルは、サーバーと Web ブラウザーのクライアント間の通信の xhr ポーリング トランスポートを使用するを指定します我々 のコードの行を追加したのでこの記事の執筆の時点で、WebSockets Windows Azure の Web サイトでは、サポートされていないことに注意してください。 Git でダウンロードすることができますを使用してアプリケーションを Windows Azure の Web サイトを配置する最も簡単な方法です git-scm.com/ダウンロード。 インストールされている場合に Windows Azure ポータルに行く manage.windowsazure.com と新しい空の Web サイトを作成します。 Git 発行で示すように、対応するオプションをクリックして有効に図 6

Enable Git Publishing for Your New Web Site
図 6 は、Git の出版、新しい Web サイトを有効にします。

数秒後に Git リポジトリ URL、Web サイトの表示、新しい画面が表示されます。 あなたのアカウントの資格情報をまだ設定していない場合は、続行する前にする必要があります。 URL は、フォームの https://WindowsAzureAccount@WebSiteName.scm.azurewebsites のです。 net/WebSiteName.git。 次の展開手順で使用されるため、記録します。 モジュールは、まずダウンロードする必要があるため、ローカル テストを実行してください。 (Web サイトも Mac と Linux は、コマンド ライン ツールを使用して作成できることに注意してください bit.ly/RGCc3A.)あなたの Web サイトを作成すると、これらの手順を実行して Node.js ソリューションを Windows Azure に展開します。

  1. コマンド プロンプトを開きして、現在のフォルダー {ドライブ文字}://nodejs/(アプリケーション作成場所) ソケットに変更します。
  2. Git init を入力します。 これは、ソリューション用のローカルの Git リポジトリを作成します。
  3. Git の種類を追加します。 これは、ソリューションを新しいローカル リポジトリに追加します。
  4. Git commit – m「初期コミットメント」を入力します。これは、保留中の Git のコミットメントを作成します。
  5. Git リモート azure {URLforGITRepository} を入力します。 Git が以前に記録された Windows Azure ポータルでは、URL を使用します。
  6. タイプの git のプッシュ紺碧のマスター。 要求されたときにパスワードを入力します。
  7. 100% に、進行状況を取得し、ソリューションは、クラウドで使用する準備ができているまで待ちます。

現実世界のシナリオ 2:迅速かつ堅牢な RESTful Web サービス レイヤーは、データ アプリケーションを作成する私たち前の記事で説明したように、さまざまなデバイス (iOS、Android、Windows Phone) で実行されているモバイル ソリューション彼らがバック エンドにデータ操作へのアクセスを提供する Web サービスに話すことによって統一することができます。 これは通常、抽出またはからまたは、データベースに情報を挿入するデータ層として UI オブジェクト (通常は JSON 形式) を内部オブジェクトにマップ サービス レイヤーが必要です。 これは、伝統的な Web サーバーで IIS および ASP.NET Web API などのフレームワークを使用して達成することができますが、Node.js とデリゲートをデータベース エンジンのクエリにより、JavaScript のネイティブの JSON 形式の応答を送信します単純な編曲家としてこのシナリオをより簡単なソリューションを提供しています (を参照してください図 7)。

Node.js Provides a Web Service Layer to Data Apps
図 7 Node.js Web サービス層データ アプリケーションを提供しています

データベースから取得したすべてのオブジェクトは、res.json メソッドを使用して簡単に JSON 形式で返さすることができます。 この例では図 8 ゆっくり呼び出しのカップル用に HTTP サーバーを定義します、SQL Server データベースからデータを読み取るし、結果が JSON 形式で返されます。

図 8 Windows Azure で実行される SQL Server データベースの完全 RESTful API を公開

var sql = require('msnodesql');
var express = require('express');
var conn_str = "Driver={SQL Server Native Client 11.0};
  Server=[serverName].database.windows.
net,1433;Database=AdventureWorks2012;
  Trusted_Connection={No};
  Uid=[LoginForDb]@[serverName];Pwd=[Password];Encrypt=yes";
var app = express();
var port = process.env.PORT || 8080;
app.get('/', function(req,res) {sql.query(conn_str, "SELECT FirstName,
  LastName FROM Person.Person", function (err, results) {
    if (err)
      console.log(err);
    else
      res.json(results);
  })
});     
app.get('/lastname/:lastname', function(req,res) {sql.query(conn_str,
  "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE ?",
  [req.params.lastname], function (err, results) {
    if (err)
      console.log(err);
    else
    {
      for (var i = 0; i < results.length; i++) {
        res.json(results[i]);
      }
    }
  })
});
app.listen(port);
console.log("Server listening on port 8080");

このソリューションをテストするのには、AdventureWorks データベース展開に Windows Azure での説明に従って bit.ly/d0apaC。 接続文字列の例を変更する必要があります図 8 に応じて。 例を Windows Azure に展開するには、ローカルでのテストと、クラウドに配置する最初のシナリオで説明した同じ手順を実行します。

これは Windows Azure で実行して、データ層の RESTful API を公開する簡単な方法です。 我々 はこのシナリオを説明するために、SQL Server データベースを使用しても、他の多くのデータ エンジン Node.js、Windows Azure テーブル ストレージ、MongoDB、カサンドラなどでサポートされています。 いくつかの MongoDB のようなサービスとしてモデル Node.js アプリケーションを含む、マイクロソフト クラウドにデプロイされたアプリケーションとの統合を容易に Windows Azure の店で提供しています。

まとめ

我々 は Node.js 使用できるシンプルな接続タスクの活用その 1 つの 2 つの現実世界のシナリオを示した­スレッド アプローチとコミュニティによって作成されたモジュール。 重要なことは、このモデルは、同期ブロッキング操作を混乱させるし、アプリケーションはこれを念頭に置いて作成する必要がありますです。 多くの場合、Node.js インストールされたサイド バイ サイドその他エンジンをソリューション内の特定の機能をオフロード サーバーとして動作することができます。 また、Node.js の拡張性と必要な制御レベルに応じての Windows Azure では、3 つのモデルを使用して展開することができます。

Get help building your Azure app!

Bruno Terkalyは、マイクロソフトの開発者エバンジェリストです。彼の深い知識は、多数のプラットフォーム、言語、フレームワーク、SDK、ライブラリ、および API を使用してコードを作成し、現場で長年の経験を積むことで得られたものです。コードの作成、ブログ、クラウド ベースのアプリケーション構築 (特に、Windows Azure プラットフォームの使用) に関するライブ プレゼンテーションに携わっています。

Ricardo Villalobosは、経験豊かなソフトウェア アーキテクトとして、サプライ チェーン管理業界の企業用アプリケーションを 15 年以上にわたって設計および作成しています。さまざまな技術認定資格の保持者であり、ダラス大学で経営管理の修士号を取得しています。彼はマイクロソフトの Windows Azure CSV 開発支援グループのクラウド アーキテクトを務めています。

この記事のレビュー、次技術専門家のおかげで:Glenn Block
グレン ・ ブロックは、オープン ソース開発のためのキックのお尻プラットフォームをように Windows Azure チームに動作します。 彼は製品を開発していないまたは家族と一緒に、彼は会見でどこか世界では、見つけることができます離れていくつか新しいものをハッキングには、ペアリングするとき誰と彼は見つけることができる、または、夜の早い時間につぶやき @gblock