本文章是由機器翻譯。

Azure 內幕消息

Microsoft Azure 及開放原始碼強力網格運算

Bruno Terkaly
Ricardo Villalobos

想像一下您自己利用了微軟 Azure 和連接設備的很大數量的網格計算平臺的建立。目標是充分利用,過剩的計算能力,在現代瀏覽器中,將每個用戶端發送少量的 JavaScript 代碼和資料,以執行計算的工作中找到。完成後,每個設備連接到此網格將結果發送回居住在 Azure 的中央伺服器。

有這樣的事情其實在的地方 — — 為額外地面情報 (SETI) 專案搜索。尋找外星生命使用大型網格或互聯網上的分散式運算。它通過分析微波頻譜中的電磁波輻射監測標誌的外星文明傳輸資料的空間。它是電源的網格計算的一個好例子。

一般用途的網格

在本月的專欄中,我們將創建更多的普通網格計算系統。這將讓我們發送特定的代碼和資料我們想要在每個網格節點上執行。對於這個專案,每個用戶端瀏覽器將收到 JavaScript 以及資訊處理的一大的塊。這可以讓我們更精確地控制在瀏覽器中執行的任務。我們會介紹的例子解決了網格計算的上下文中可能出現的很多通用的計算問題。

這項工作的創世記出來的微軟參與世界上最大的 hack 科技緊縮擾亂 2013年之一。微軟花了 280 隊的第三位。你可以看到整個解決方案, tcrn.ch/OkIchx

像這種比賽在面臨的挑戰是你只需要兩天完成一個專案之前,法官過來把你打下來。除了處理與睡眠剝奪,您必須利用盡可能多的預置的元件盡可能按時完成專案。大多數,如果不是全部,在競爭中使用的技術基於開放源碼軟體在 Azure 中運行。使用的開放原始碼技術包括玉器、 快遞、 Socket.io、 引導、 jQuery 和 Node.js。

Web 通訊端

我們對現在無處不在的網路通訊端標準很大程度依賴。Web 通訊端是 HTML5 倡議的一部分。他們提供全雙工雙向連接,你可以傳輸用戶端和伺服器之間的消息。Web 通訊端啟用伺服器向瀏覽器發送的內容,沒有被顯式要求由用戶端的標準化的方法。

這讓我們來來回回,同時保持連接打開交換消息 — — 創造充分的溝通和業務流程,這是為網格計算系統的必要能力。今天的現代瀏覽器火狐瀏覽器 6、 Safari 6、 谷歌 Chrome 14、 歌劇 12.10 和 Internet Explorer 10 (和更高版本) 等普遍支援 Web 通訊端。

Web 通訊端的作用

Web 通訊端開始工作時,用戶端 Web 通訊端握手請求向伺服器發送 HTTP GET 請求的形式。與 Web 通訊端,什麼跟隨握手不符合要求的標準的 HTTP 協定。在全雙工資料文字方塊架來來回回,發送帶有每個代表有效載荷,伴隨著一個小標頭的文字方塊架。您可以跨多個資料幀拆分較大的郵件。

Web 通訊端管道嘗試檢測如果有一個使用者代理配置,這會讓你建立持久性通信隧道。在我們的實現,使用者代理是只是一個欄位 HTTP 標頭中發送一個特殊的 HTTP 要求,基本上說,使用"切換到 Web 通訊端。在本文中,我們將使用 Web 通訊端將可執行 JavaScript 和資料發送到每個 Web 用戶端。作業完成後,我們會使用 Web 通訊端將計算結果發送回 Node.js 伺服器。這是我們稍後會解釋我們的體系結構的關鍵區段。

運行整個專案你自己是很容易的。您可以查看在行動中會顯示該專案的簡短視頻 1drv.ms/1d79pjo。然後再去看視頻,你可以抓住從在 GitHub 的所有代碼 bit.ly/1mgWWwc。設置專案運行非常簡單與 Node.js:

  1. 通過安裝 Node.js 從開始 nodejs.org
  2. 安裝 Git (git scm.com) 或 GitHub (github.com)
  3. 與一個 Git 克隆克隆你叉 (bit.ly/1cZ1nZh)
  4. 在克隆的目錄中安裝 Node.js 套裝軟體管理器 (故宮)
  5. 開始運行的故宮

您需要安裝在此列中突出顯示的各種 Node.js 套裝軟體。您可以下載使用故宮在 npmjs.org 的套裝軟體。您還可以瞭解如何將它們安裝在Visual Studio中按右鍵 bit.ly/OBbtEF。若要瞭解更多有關使用 Node.js 的Visual Studio,查閱布魯諾的博客張貼內容,"入門與 Node.js 和Visual Studio"(bit.ly/1gzKkbj)。

專注于 App.js

我們創建的最終解決方案實際上有兩個伺服器端進程。第一次和最明顯的伺服器端進程是那個是大型計算作業分成更小的碎片和分發工作和對連接的用戶端瀏覽器的資料。您可以在 App.js 中找到該代碼。

有一個提供一個入口網站的第二個伺服器端進程管理的經驗和查看大型計算作業執行的網格上。您可以在 Server.js 中找到該代碼。它提供了一個即時儀表板的經驗,完成與活更新圖形和數位通過瀏覽器 (見圖 1)。我們列將重點的 App.js 代碼。


圖 1 高級別網格體系結構

業務流程的詳細資訊

Node.js 提供了一些令人驚訝的電源­説明你的高傲抽象組裝一個優雅的實現。首先,你需要解決發送一段 JavaScript 代碼想要執行的作為大網格作業的一部分的問題。您還需要發送一些資料的代碼將使用 JAVAscript。

您可以使用 Node.js 包快遞和 Socket.io 來實現此目的。它是不夠的只是將只是一段 JavaScript 代碼和資料發送到瀏覽器。您仍然需要的方式執行對資料的代碼,並將結果發送回伺服器。你可以使用 Index.jade 模組解決此問題。這意味著第二塊的 JavaScript 代碼來管理執行網格代碼本身。

三個節點套裝軟體 (以及一些支援套裝軟體) 大大簡化實施這種體系結構。例如,快遞包裹是一個受歡迎的包,説明與 URL 路由,處理的請求和意見。它還簡化了這樣分析的有效載荷,cookie 存儲會話的事物。

另一個功能強大的套裝軟體是 Socket.io,其中文摘走 Web 通訊端和包括方便的功能,例如廣播和多播。Socket.io 使您可以設置伺服器和瀏覽器上使用語法相同的 JavaScript 代碼的雙向通信。Socket.io 管理運行在瀏覽器和伺服器的 JavaScript。這正是我們相信使 Node.js 偉大。沒有精神的上下文切換,寫作在伺服器與用戶端運行的 JavaScript。

Node.js 與玉,簡化了創建一個 Web 介面的過程是緊密集成。玉提供了一種基於範本的方法創建的 HTML,除了包含業務流程管理伺服器和瀏覽器 (用戶端) 之間的通信的 JavaScript 代碼。

在一起,採取的所有包中引用圖 2 將大大減少您必須編寫的代碼數量。好的 Node.js 開發人員理解的語言和的內置功能。偉大的 Node.js 開發人員熟悉各種套裝軟體,熟練有效地使用他們。幫自己的忙和自己熟悉在 npmjs.org 的 Node.js 包裝模組庫。


圖 2 雙向通信的網格體系結構

雙向邏輯

最終,用戶端和伺服器之間的業務流程是什麼比狀態機雙向邏輯。例如,用戶端可能會處於等候狀態的 JavaScript 代碼或者它可能處於等候狀態的資料將被接受。

在伺服器端將有相應的國家,如發送 JavaScript 狀態或發送的資料狀態。您會注意到的 Node.js 代碼,例如,"Socket.on ("某些國家"),"中的語句,指示伺服器正在等待接收魔法的字串來觸發狀態更改 (請參見圖 3)。然後它可以對這一事件作出適當反應。

圖 3 部分上市中設置 Node.js 套裝軟體 App.js

// Setup libraries.
var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
var socketio = require('socket.io');
var app = express();
var azure = require('azure');
var fs = require('fs')
// Code omitted for brevity.
// Let Jade handle the client-side JavaScript and HTML
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');

讓我們首先檢查安裝程式碼 Node.js 伺服器-­側過程。 工作流開始時伺服器打開一個埠,並等待連接。 快遞和 Socket.io 讓伺服器偵聽傳入的連接埠 3,000 上的瀏覽器:

// Create a Web server, allowing the Express package to
// handle the requests.
var server = http.createServer(app);
// Socket.io injects itself into HTTP server, handling Socket.io
// requests, not handled by Express itself.
var io = socketio.listen(server);

發送到瀏覽器的 JavaScript

一旦建立連接,伺服器等待來自用戶端,該值指示用戶端是準備好接收一些 JavaScript 代碼通過 Web 通訊端連接消息。 在九行中的代碼圖 4 代表等為發生的連接和用戶端發送字串"準備工作"的伺服器,它表示到伺服器 JavaScript 應發送回用戶端。

圖 4 部分上市的 JavaScript 和網格上的瀏覽器的資料分佈的伺服器端代碼

(001) // Code Part 1
(003) // Wait for the browser to say it’s ready for the job.
(005) // If it is, send the JavaScript to the grid node for execution.
(007) // Do the same thing for the data being sent to the browser.
(009) io.on('connection', function(socket) {
(011)   socket.on('ready for job', function() {
(013)     clients++;
(015)     socket.emit('job', 'function process(message){function isInRange(origin,target,range){function toRad(deg){return deg*Math.PI/180}function getDistance(origin,target){var R=6371;var delta={lat:toRad(target.lat-origin.lat),lon:toRad(target.lon-origin.lon)};var start=toRad(origin.lat);var end=toRad(target.lat);var a=Math.sin(delta.lat/2)*Math.sin(delta.lat/2)+Math.sin(delta.lon/2)*Math.sin(delta.lon/2)*Math.cos(start)*Math.cos(end);var c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return R*c}return getDistance(origin,target)<range}function parseData(data){var parts=data.split(",");return{lat:parts[parts.length-1],lon:parts[parts.length-2]}}var target=parseData(message.body);var origin={lat:37.769578,lon:-122.403663};var range=5;return isInRange(origin,target,range)?1:0}');
(017)   });
(018)
(021) // Code Part 2  Sending data to the browser for processing
(023) // when 'ready for data event' fires off.
(025)   socket.on('ready for data', function() {
(027)     socket.isClient = true;
(029)     sendDataToSocket(socket);
(031)   });
(032)
(035) // Code Part 3 - retrieving the results of the computation.
(037) // A more thorough implementation will aggregate all the
      // results from all the browsers to solve the large computational
(039) // problem that has been broken into small chunks for each browser.
(041)   socket.on('results', function(message, results) {
(043)     messageCount++;
(045)     crimesInRange += results;
(047)   });
(048)
(051) // Code Part 4 - A basic method to send data to a connected
      // client with a timeout of 77 ms.
(053) function sendDataToSocket(socket) {
(055)   var data = lines.shift();
(057)   lines.push(data);
(059)   setTimeout(function() {
(061)     // To one client, singular
(063)     socket.emit('process', {
(065)                                        body: data
(067)     });
(069)   }, 77);
(071) }

此時,我們只對了一半。 用戶端仍然需要請求要處理的資料。 該代碼是一些基本的三角代碼來計算使用的 GPS 座標的兩個點之間的距離。 您可以替換任何你想要在這裡的 JavaScript 代碼。

第二部分中的代碼表示伺服器等待的字串"資料準備好"的狀態中第 25 行處圖 4。 這是信號的資料瀏覽器的請求。 在第一部分中先前發送的 JavaScript 將處理此資料。 第三部分中的代碼表示用戶端瀏覽器完畢上發送的資料計算的狀態。 當伺服器收到的字串結果在行 41 時,它已準備納入該瀏覽器的計算工作的最終結果。 此時,瀏覽器可能發送另一份工作要做更多的處理,重複週期。

玉引擎

玉是集成到 Node.js 生產 HTML 視圖和範本化引擎。 玉極大地簡化了的標記和你寫的瀏覽器的 JavaScript。 圖 5 顯示玉的標記語言,用於定義使用者介面。

圖 5 玉定義 UI

// Part 1
// This UI markup gets translated into real HTML
// before running on the client.
block content
  h1= title
  p This is an example client Web site.
Imagine a beautiful Web site without any advertisements!
p This page is processing
    span#items
    |  jobs per second.
// Part 2
// This is the client-side JavaScript code.
script.
var socket = io.connect();
    var job = function(id, data) {  };
    var createFunction = function(string) {
      return (new Function( 'return (' + string + ')' )());
    }
    var items = 0;
    function calculateWork() {
      $('#items').text(items);
      items = 0;
    }
    setInterval(calculateWork, 1000);
    socket.on('connect', function() {
      socket.emit('ready for job');
    });
    socket.on('job', function(fn) {
      job = createFunction(fn);
      console.log(fn);
      console.log(job);
      socket.emit('ready for data');
    });
    socket.on('process', function(message) {
      var results = job(message);
      items++;
      socket.emit('results', message, results);
      socket.emit('ready for data');
    });

首先,它只是顯示在瀏覽器中的工作進展。 第二,它需要的 JavaScript 和由伺服器發送的資料。 這表示它需要執行的計算工作。 它將執行的工作,將結果返回到伺服器。

如果你想過如何將 JavaScript 發送到瀏覽器執行, 圖 5 表示您需要執行此操作的代碼。 如果你想要知道更多有關如何玉作品,我們建議在此出色地簡單解釋玉-lang.com。 底線是可以編寫代碼了沒有所有棘手 HTML 標籤,角括弧的視覺化介面,等等。

有我們沒機會以支付這一專案的其他方面。 其中一個較大的片斷是在 Server.js,哪裡門戶體驗生活,並允許您跟蹤所有網格作業過程中的進度。 它包括一個漂亮的使用者介面,是 100%基於 Web。 它是即時的、 不斷更新的儀表板,完整的圖表和圖形。 我們還 didn't 處理安全的實際方面和有人劫持和修改 JavaScript 發送到用戶端並做傷害的威脅。

總結

您可以調整為其他一般用途的網格計算問題這一切。 我們認為更重要的是這篇文章是電源和 Node.js 的靈活性。 在 Node.js 的 GitHub 上回購超過 jQuery,強大見證了 Node.js 與今天的現代開發者的共鳴。

我們要感謝,在啟動和合作夥伴傳福音的其工作就是説明公司和企業家到理解和利用 Microsoft 堆疊和相關的技術,其中許多都是開放來源。 沃倫 Wilbee,西部地區啟動管理器中,種子與他的頂尖球員,包括 Felix Rieseberg、 海倫曾、Steve以英語發言、 蒂莫西 · StrimpleWillTschumy 的一些科技緊縮破壞團隊。

Bruno Terkaly 是微軟開發者福音傳教士。他淵博的知識是來自在該領域使用眾多平台、語言、架構、SDK、程式庫和 API 撰寫程式碼的多年經驗。他花時間編寫代碼,寫博客,給現場演示上構建基於雲計算的應用程式,具體地使用 Azure 平臺。您可以閱讀他的博客在 blogs.msdn.com/b/brunoterkaly

Ricardo Villalobos 是具有超過 15 年的經驗設計和創建應用程式的公司在多個行業的經驗豐富的軟體設計師。他從達拉斯大學工商管理持有不同的技術認證,以及碩士學位,為微軟,説明世界各地的公司要在 Azure 實施解決方案作為一個雲建築師在 DPE 全球範圍內參與合作夥伴團隊工作。您可以閱讀他的博客在 blog.ricardovillalobos.com

Terkaly 和比利亞洛沃斯共同提出大行業會議。 他們鼓勵讀者的 Azure 內幕交易與他們聯繫的可用性。 也可以撥打 Terkaly bterkaly@microsoft.com 和比利亞洛沃斯也可以撥打 Ricardo.Villalobos@microsoft.com

感謝以下 Microsoft 技術專家對本文的審閱:格特服裝、 Cort 弗裡茨和Tim公園