Freigeben über


Dieser Artikel wurde maschinell übersetzt.

Azure-Insider

Microsoft Azure und Power-Grid-Computing mit Open Source

Bruno Terkaly
Ricardo Villalobos

Bruno Terkaly and Ricardo VillalobosStellen Sie sich vor, Erstellen eigener Grid-computing-Plattform, die Microsoft Azure und eine große Anzahl von angeschlossenen Geräte nutzt.Das Ziel ist, die überschüssige Rechenleistung in modernen Browsern, Senden von jedem Client eine kleine Menge von JavaScript-Code und Daten für einen IT Job durchzuführen gefunden zu nutzen.Nach der Fertigstellung sendet jedes Gerät an das Netz angeschlossen die Ergebnisse zurück an einen zentralen Server in Azure wohnten.

So etwas tatsächlich vorhanden ist – die Suche nach zusätzlichen terrestrischen Intelligenz (SETI) Projekt.Die Suche nach außerirdischem Leben verwendet einen groß angelegten Raster oder verteiltes Rechnen über das Internet.Es überwacht Platz für Zeichen der Übertragungen von Außerirdischen Zivilisationen durch elektromagnetische Strahlung im Mikrowelle Spektrum analysieren.Es ist ein gutes Beispiel für die Macht des Grid-computing.

Universelles Raster

Im Artikel dieses Monats erstellen wir eine mehr allgemeine Grid-computing-System.Dies sendet uns spezifischen Code und Daten wollen wir auf jedem Rasterknoten ausgeführt.Für dieses Projekt erhält jeder Clientbrowser ein Stück JavaScript zusammen mit den Informationen verarbeitet werden.Dadurch können wir genauer Kontrolle die Aufgabe, die im Browser ausgeführt.Das Beispiel präsentieren wir löst viele allgemeine EDV-Probleme, die im Rahmen des Grid-computing kommen könnte.

Die Entstehung dieser Arbeit kam aus der Beteiligung von Microsoft in einer der weltweit größten Hackathons, Tech Crunch stören 2013.Microsoft erreichte den dritten Platz von 280 Teams.Kann man die gesamte Lösung bei tcrn.ch/OkIchx.

Die Herausforderung bei einem Wettbewerb so ist, dass Sie nur zwei Tage, ein Projekt zu vollenden, bevor die Richter kommen und Sie abschießen.Neben Umgang mit Schlafentzug haben Sie so viele vorgefertigte Komponenten weiterverwendet werden wie möglich, das Projekt rechtzeitig durchzuführen.Am meisten, wenn nicht sogar alle, basiert die Technologie im Wettbewerb auf open-Source-Software in Azure ausgeführt.Die eingesetzten open-Source-Technologien enthalten, Jade, Express, Socket.io, Bootstrap, jQuery und Node.js.

Web Sockets

Wir setzte stark auf die jetzt allgegenwärtige Web Sockets-standard.Web Sockets sind Teil der HTML5-Initiative.Sie bieten eine voll-duplex bidirektionale Verbindung über die Nachrichten zwischen Client und Server übertragen werden können.Web Sockets ermöglichen einen standardisierten Ansatz für den Server Inhalt an den Browser senden, ohne explizit vom Client angefordert wird.

Diese lassen uns tauschen Nachrichten hin und her, während die Verbindung offen zu halten — erstellen vollständige Kommunikation und Orchestrierung, die einen erforderlichen Fähigkeiten für ein Grid-computing-System ist.Heutige moderne Browser wie Firefox 6, Safari, Google Chrome 14, Opera 12.10 6und InternetExplorer 10 (oder höher) unterstützen universell Web Sockets.

Rolle des Web Sockets

Web Sockets arbeiten, wenn der Client eine Web-Socket-Handshake-Anforderung in Form einer HTTP GET-Anforderung an den Server sendet.Mit Web-Buchsen entsprechen was den Handshake folgt nicht das HTTP-Protokoll.Daten-Textrahmen in voll-Duplex werden hin und her, mit jedem Textrahmen, die eine Nutzlast, begleitet von einem kleinen Header gesendet.Sie können größere Nachrichten auf mehrere Daten-Frames aufgeteilt.

Der Web-Socket-Sanitär versucht zu erkennen, ist ein User-Agent konfiguriert, die Ihnen einen beständige Kommunikation-Tunnel zu erstellen lassen würde.In unserer Implementierung ist der User-Agent einfach ein Feld im HTTP-Header verwendet, um eine HTTP-Anfrage zu senden, die im Grunde sagt, "Wechseln Sie zur Web Sockets." In diesem Artikel verwenden wir Web Sockets zur ausführbaren JavaScript und Daten zu jedem Web-Client zu senden.Sobald der Auftrag abgeschlossen ist, verwenden wir die Web-Buchsen, computational Ergebnisse zurück an die Node.js-Server zu senden.Dies ist der wichtigste Teil der Architektur, die wir später eingehen werde.

Es ist ganz einfach, das gesamte Projekt selbst ausgeführt.Sie können anzeigen, ein kurzes Video, das zeigt das Projekt in Aktion am 1drv.ms/1d79pjo.Bevor das Viedeo, Sie können den Code von GitHub am grab bit.ly/1mgWWwcEs ist einfach mit Node.js, Einrichten des Projekts ausgeführt:

  1. Start durch die Installation von Node.js aus nodejs.org
  2. Installieren Git (Git-scm.com) oder GitHub (github.com)
  3. Klonen Sie Ihre Gabel durch einen Git-Klon (bit.ly/1cZ1nZh)
  4. Installieren Sie Node.js-Paketmanager (NPM) in das geklonte Verzeichnis
  5. Start NPM ausführen

Sie müssen die verschiedenen Node.js-Pakete, die in dieser Spalte hervorgehoben zu installieren.Sie können die Pakete mit dem NPM auf npmjs.org herunterladen.Sie können auch lernen, wie man sie mit einem Rechtsklick im Visual Studio installiert bit.ly/OBbtEF.Um weitere Informationen zur Verwendung von Visual Studio mit Node.js erfahren, lesen Sie Brunos Blog-Post, "Erste Schritte mit Node.js und Visual Studio(bit.ly/1gzKkbj).

App.js im Fokus

Die endgültige Lösung, die wir erschaffen hat eigentlich zwei serverseitigen Prozessen.Der erste und offensichtlichste serverseitigen Prozess ist diejenige, die den großen EDV-Job in kleinere Stücke brechen und verteilen die Arbeit und die Daten an die angeschlossenen Client-Browser.Sie finden diesen Code in App.js.

Es gibt ein zweiter Server-seitige-Prozess, die ein Portal bereitstellt Erfahrung zum Verwalten und anzeigen, die große computing jobs ausführen in der Startaufstellung.Sie finden diesen Code in Server.js.Es bietet eine Echtzeit-Dashboard-Erfahrung, komplett mit live Update Grafiken und Zahlen über einen Browser (siehe Abbildung 1).Unserer Rubrik konzentrieren sich auf den App.js-Code.

High-Level Grid Architecture
Abbildung 1-hochrangige Grid-Architektur

Orchestrierung Details

Node.js bietet einige überraschend power­Ful Abstraktionen, mit denen Sie bauen eine elegante Implementierung.Zuerst müssen Sie das Problem des Sendens ein Stück JavaScript-Code, die Sie als Teil der großen Grid-Job ausführen wollen.Sie müssen auch schicken einige Daten das Javascript Code verwendet wird.

Die Node.js Paket Express und Socket.io können um dies zu erreichen.Es reicht nicht, einfach nur ein Stück JavaScript-Code und Daten an den Browser gesendet.Sie benötigen noch eine Möglichkeit, führen Sie den Code für die Daten und das Ergebnis zurück an den Server senden.Sie können dies beheben, mit dem Index.jade-Modul.Dies bedeutet, dass es ein zweites Gepäckstück von JavaScript-Code zur Ausführung des Grid-Codes selbst zu verwalten.

Drei Knoten Pakete (zusammen mit einigen unterstützenden Pakete) erleichtern erheblich die Implementierung dieser Architektur.Das express-Paket ist beispielsweise ein beliebtes Paket, die mit URL-Routen, Umgang mit Anforderungen und Ansichten hilft.Es vereinfacht auch Dinge wie Parsen Nutzlasten, Cookies und Sessions zu speichern.

Ein anderes leistungsfähiges Paket ist Socket.io, die abstrahiert Weg Web Sockets und umfasst praktische Funktionen wie Broadcasts und Multicasts.Socket.IO können Sie bidirektionale Kommunikation mit syntaktisch identisch JavaScript-Code auf dem Server und dem Browser einrichten.Socket.IO verwaltet das JavaScript, das in den Browser und dem Server ausgeführt wird.Das ist genau das, was wir glauben Node.js großartig macht.Es gibt keine geistige Kontextwechsel mit dem Schreiben von JavaScript, das auf dem Server gegenüber dem Client läuft.

Node.js ist eng mit Jade, die den Prozess der Erstellung einer Webschnittstelle optimiert.Jade bietet einen Template-basierte Ansatz zum Erstellen des HTML-Code, neben der Orchestrierungs JavaScript-Code, der die Kommunikation zwischen Server und Browser (Client) verwaltet.

Zusammengenommen, alle Pakete wird in den Abbildung 2 verringert drastisch die Menge an Code schreiben.Ein guter Node.js-Entwickler versteht die Sprache und die integrierten Funktionen.Ein großer Node.js-Entwickler ist vertraut mit den verschiedenen Paketen und bereits Erfahrung mit ihnen effizient.Tu dir selbst einen Gefallen und machen Sie sich vertraut mit der Node.js verpackt Module Library unter npmjs.org.

The Bidirectional Communication of Grid Architecture
Abbildung 2 die bidirektionale Kommunikation der Grid-Architektur

Bidirektionale Logik

Letztlich ist die Orchestrierung zwischen Client und Server nichts anderes als die bidirektionale-Logik der Staaten-Maschine.Z. B. der Client möglicherweise in einen Wartezustand für den JavaScript-Code oder ist es eventuell in einen Wartezustand für die Daten empfangen werden.

Die Server-Seite haben die korrespondierenden Zustände, wie z. B. JavaScript Entsendestaats oder Entsendestaats Daten.Sie werden bemerken, dass Anweisungen in die Node.js-Code, z. B. "Socket.on ("einige Staat"),", der angibt, der Server wartet zum Empfangen einer magischen Zeichenfolge um eine Zustandsänderung auslösen (siehe Abbildung 3).Dann kann es entsprechend auf dieses Ereignis reagieren.

Abbildung 3 teilweise im App.js für das Einrichten von Node.js Pakete auflisten

// 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');

Beginnen wir mit der Prüfung der Setupcode für Node.js-Server -­Seite Prozess. Der Workflow beginnt, wenn der Server einen Port öffnet und auf Verbindungen wartet. Express- und Socket.io lassen Sie den Server für eingehende Verbindungen von Browsern auf Port 3.000 zu hören:

// 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 zum Browser schicken

Sobald die Verbindung hergestellt ist, wartet der Server eine Nachricht vom Client, der angibt, dass der Klient bereit, einige JavaScript-Code durch die Web-Socketverbindung zu empfangen ist. Der Code in Zeile 9 in Abbildung 4 stellt die Wartezeit für die Verbindung stattfinden und für den Client zu senden der Zeichenfolge "ready for Job" Server angibt, an den Server das JavaScript gesendet werden soll zurück an den Client.

Abbildung 4 partielle Liste der serverseitigen Code, das JavaScript und Daten in Browsern auf das Raster verteilt

(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) }

Zu diesem Zeitpunkt sind wir auf halbem Wege. Der Client muss noch die Daten verarbeiten anfordern. Der Code ist einige grundlegenden trigonometrischen Code Abstand zwischen zwei Punkten, die mit GPS-Koordinaten zu berechnen. Sie konnte keinen Javascriptcode ersetzen, was wollen Sie hier.

Den Code in Teil zwei darstellt den Zustand, in dem der Server die Zeichenfolge "Ready for Data wartet" auf Linie 25 in Abbildung 4. Dies signalisiert die Browser-Anfrage für Daten. Das JavaScript, das zuvor in Teil eins gesendet wird diese Daten verarbeiten. Der Code in Teil drei stellt den Zustand in dem der Clientbrowser Berechnungen auf gesendeten Daten abgeschlossen hat. Wenn der Server String-Ergebnisse in Zeile 41 empfängt, ist es bereit, diesen Browser Endergebnis für den EDV-Job zu übernehmen. Zu diesem Zeitpunkt konnte der Browser einen anderen Job für weitere Verarbeitung, den Zyklus zu wiederholen gesendet werden.

Die Jade-Engine

Jade ist eine produktive HTML Ansicht und Templating Engine in Node.js integriert. Jade vereinfacht das Markup und JavaScript, die Sie für den Browser zu schreiben. Abbildung 5 zeigt die Jade Markupsprache, die die Benutzeroberfläche definiert.

Abbildung 5 Jade definiert die Benutzeroberfläche

// 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');
    });

Erstens zeigt es einfach den Fortschritt der Arbeit an den Browser.Zweitens braucht es das JavaScript und die Daten vom Server gesendet wurden.Dies entspricht den computational Job, den sie ausführen soll.Es führt den Auftrag, die Ergebnisse zurück an den Server zurückgegeben.

Wenn Sie sich jemals wie gefragt Sie JavaScript an einen Browser für die Ausführung, senden Abbildung 5 stellt den Code musst du dies tun.Wenn Sie mehr über wie Jade Werke erfahren möchten, empfehlen wir diese genial einfach Erklärung bei Jade-lang.com.Die Quintessenz ist, dass Sie auf eine grafische Benutzeroberfläche ohne alle knifflige HTML Tags, Spitze Klammern und so weiter Code schreiben können.

Es gibt andere Aspekte dieses Projekts bekommen wir die Chance zur Deckung nicht.Die größeren Stücke gehört in Server.js, wo die Portalfunktionalität lebt und können Sie den Fortschritt der Raster Arbeitsplätze im Prozess zu verfolgen.Es enthält eine schöne Benutzeroberfläche, die 100 Prozent Web-basierte.Es ist ein Leben, ständig aktualisierten Dashboard, komplett mit Grafiken und Diagrammen.Wir uns widmen nicht auch die praktischen Aspekte der Sicherheit und der Bedrohung durch jemanden entführen und ändern das JavaScript an den Client gesendet und Schaden.

Zusammenfassung

Sie konnte all dies für andere Allzweck Grid computing Probleme anpassen.Wir denken, die wichtigere nehmen weg von diesem Artikel die Leistungsfähigkeit und Flexibilität von Node.js ist.Die Repos auf GitHub für Node.js übersteigen von jQuery, ein deutlicher Beweis von Node.js wie mit heutigen modernen Entwickler schwingt.

Wir danken den Start und Partner Evangelisten, deren Aufgabe es ist, helfen Unternehmen und Unternehmer verstehen und nutzen Sie den Microsoft-Stack und verwandte Technologien, von die viele offen sind bezogen.Warren Wilbee, Region West Startmanager, entkernt das Tech Crunch stören Team mit einigen seiner besten Spieler, einschließlich Felix Rieseberg, Helen Zeng, Steve Seow, Timothy Strimple und Will Tschumy.

Bruno Terkaly arbeitet als Entwicklungsexperte für Microsoft. Seine fundierten Kenntnisse basieren auf mehreren Jahren Erfahrung in der Programmierung in unterschiedlichsten Plattformen, Sprachen, Frameworks, SDKs, Bibliotheken und APIs. Er verbringt Zeit Schreiben von Code, Blogging und geben live-Präsentationen auf den Aufbau von Cloud-basierten Anwendungen, speziell über die Azure-Plattform. Lesen Sie seinen Blog unter blogs.msdn.com/b/brunoterkaly.

Ricardo Villalobos ist ein erfahrener Softwarearchitekt mit mehr als 15 Jahren Erfahrung im Entwerfen und Erstellen von Anwendungen für Unternehmen in verschiedenen Branchen. Halten verschiedene technische Zertifizierungen, sowie einen Master-Abschluss in Betriebswirtschaft von der Universität Dallas, arbeitet er als Architekt Wolke in der DPE weltweit engagierten Partner-Team für Microsoft, hilft Unternehmen weltweit Lösungen in Azure zu implementieren. Sie können lesen Sie seinen Blog unter blog.ricardovillalobos.com.

Terkaly und Villalobos präsentieren gemeinsam bei großen Konferenzen.Sie ermutigen die Leser der Azure-Insider zu ihnen Verfügbarkeit erhalten.Terkaly kann erreicht werden unter bterkaly@microsoft.com und Villalobos kann erreicht werden unter Ricardo.Villalobos@microsoft.com.

Unser Dank gilt den folgenden technischen Experten von Microsoft für die Durchsicht dieses Artikels: Gert Drapers, Cort Fritz und Tim Park