Este artículo proviene de un motor de traducción automática.
Información privilegiada de Azure
Microsoft Azure y computación Power Grid de código abierto
Bruno Terkaly
Ricardo Villalobos
Imagina construyendo su propia plataforma de computación grid que aprovecha Microsoft Azure y un gran número de dispositivos conectados. El objetivo es aprovechar la potencia informática excesiva en los navegadores modernos, enviando a cada cliente una pequeña cantidad de código JavaScript y datos para realizar un trabajo de computación. Al finalizar, cada dispositivo conectado a esta red envía los resultados a un servidor central que residen en Azure.
Hay algo como esto en realidad en el lugar, la búsqueda de proyectos de Inteligencia Extra terrestre (SETI). La búsqueda de vida extraterrestre utiliza una red a gran escala o computación distribuida por Internet. Espacio para las señales de las transmisiones de civilizaciones extraterrestres monitorea mediante el análisis de la radiación electromagnética en el espectro de microondas. Es un buen ejemplo del poder de la informatización.
Rejilla de propósito general
En la columna de este mes, vamos a crear una cuadrícula más general sistema de computación. Esto nos enviará datos que queremos ejecutados en cada nodo de la red y código específico. Para este proyecto, cada explorador cliente recibirán un trozo de JavaScript junto con la información que se procesará. Esto nos permite control más precisamente la tarea que se ejecuta en el navegador. El ejemplo que presentaremos soluciona muchos problemas informáticos para fines generales que podrían surgir en el contexto de la informatización.
La génesis de esta obra salió de la participación de Microsoft en uno de hackathones más grande del mundo, Tech Crunch interrumpir 2013. Microsoft tomó el tercer lugar de 280 equipos. Puedes ver la solución completa en tcrn.ch/OkIchx.
El desafío en una competencia como ésta es que sólo tiene dos días para completar un proyecto antes de que los jueces entran y te mataré. Además de ocuparse de la privación del sueño, tienes que aprovechar Componentes preconstruidos tantos como sea posible para completar el proyecto a tiempo. Más, si no todos, de la tecnología utilizada en la competencia fue basada en software open source en Azure. Las tecnologías de código abierto utilizadas incluyeron Jade, Express, Socket.io, Bootstrap, jQuery y Node.js.
Web Sockets
Confiamos fuertemente en el ahora omnipresente Web Sockets estándar. Web Sockets son parte de la iniciativa de HTML5. Proporcionan una conexión bidireccional dúplex completo sobre el cual se pueden transmitir los mensajes entre el cliente y el servidor. Web Sockets permiten un enfoque estandarizado para el servidor enviar contenido al navegador sin ser pedido explícitamente por el cliente.
Esto dejó nos intercambiar mensajes y hacia atrás manteniendo la conexión abierta — creación de comunicación completo y orquestación, que es una capacidad necesaria para una sistema de informatización en red. Los navegadores modernos como Firefox 6, 6 Safari, Google Chrome 14, 12,10 Opera y Internet Explorer 10 (y posterior) de hoy universalmente soportan Web Sockets.
Papel de la Web Sockets
Web Sockets empezar a trabajar cuando el cliente envía una solicitud de apretón de manos de zócalo Web al servidor en forma de una solicitud HTTP GET. Con Web Sockets, lo que sigue el apretón de manos no se ajusta al protocolo HTTP estándar. Marcos de texto de datos en dúplex completo son enviados hacia adelante y hacia atrás, con cada marco de texto que representa una carga acompañada de un pequeño encabezado. Los mensajes más grandes se puede dividir en múltiples marcos de datos.
Las cañerías de zócalo Web intenta detectar si hay un agente de usuario configurado, que permitiría establecer un túnel de comunicación persistente. En nuestra aplicación, el agente de usuario es simplemente un campo en el encabezado HTTP usado para enviar una solicitud HTTP especial que básicamente dice, "Cambiar a Web Sockets". En este artículo, usaremos Web Sockets para enviar datos y JavaScript ejecutable a cada cliente Web. Una vez finalizado el trabajo, utilizaremos la Web Sockets para enviar resultados computacionales al servidor Node.js. Esta es la parte clave de nuestra arquitectura que explicaremos más adelante.
Ejecutando el proyecto mismo es bastante fácil. Usted puede ver un breve video que muestra el proyecto en acción en 1drv.ms/1d79pjo. Antes de ver el video, puedes agarrar todo el código en GitHub en bit.ly/1mgWWwc. Configurar el proyecto para ejecutar es sencillo con Node.js:
- Comienzo instalando Node.js de nodejs.org
- Instalar Git (git-scm.com) o GitHub (github.com)
- Clon de la horquilla con un Git clone (bit.ly/1cZ1nZh)
- Instalar al gestor de paquetes de Node.js (MNP) en el directorio clonado
- Inicio NPM para ejecutar
Usted necesitará instalar los paquetes Node.js varios destacados en esta columna. Puede descargar los paquetes usando el MNP en npmjs.org. Usted también puede aprender cómo instalarlas con un clic derecho en el Visual Studio en bit.ly/OBbtEF. Para aprender más acerca del uso de Visual Studio con Node.js, Echale un post de blog de Bruno, "Getting Started con Node.js y Visual Studio(bit.ly/1gzKkbj).
Centrarse en App.js
La solución final que hemos creado en realidad tiene dos procesos del lado del servidor. El proceso del servidor de primero y más obvio es la que está rompiendo el trabajo informático grande en trozos más pequeños y distribuir el trabajo y los datos a los exploradores cliente conectado. Encontrarás el código en App.js.
Hay un segundo proceso de lado del servidor que proporciona un portal de experiencia para administrar y ver la computación grandes puestos de trabajo ejecutando en la red. Encontrarás el código en Server.js. Proporciona una experiencia de escritorio en tiempo real, completa con live actualizar gráficos y números a través de un navegador (ver figura 1). Nuestra columna se centrará en el código de App.js.
Figura 1 arquitectura de alto nivel Grid
Detalles de orquestación
Node.js proporciona algunos sorprendentemente la energíaful abstracciones que le ayudan a armar una implementación elegante. Primero, tienes que resolver el problema de enviar un fragmento de código JavaScript que desea ejecutar como parte del red gran trabajo. También tienes que enviar algunos datos utilizará el código Javascript.
Puede utilizar el paquete de Node.js Express y Socket.io para lograr esto. No basta con enviar una sola pieza de código JavaScript y datos al navegador. Tienes una manera de ejecutar el código contra los datos y envía el resultado al servidor. Puede resolver esto con el módulo Index.jade. Esto significa que hay una segunda pieza de código JavaScript para administrar ejecutar el código de red propia.
Tres paquetes de nodo (junto con algunos paquetes de apoyo) simplifican enormemente la implementación de esta arquitectura. Por ejemplo, el paquete expreso es un popular paquete que ayuda con rutas URL, manejo de solicitudes y vistas. También simplifica las cosas tales como análisis de cargas, las cookies y almacenamiento de las sesiones.
Otro poderoso paquete es Socket.io, que abstrae lejos Web Sockets e incluye características convenientes tales como transmisiones y multidifusiones. Socket.Io le permite establecer una comunicación bidireccional usando sintácticamente idéntico código JavaScript en el servidor y el navegador. Socket.Io gestiona el JavaScript que se ejecuta en el navegador y el servidor. Esto es precisamente lo que creemos que engrandece Node.js. No hay ningún contexto mental de conmutación con escribir JavaScript que se ejecuta en el servidor frente al cliente.
Node.js está estrechamente integrado con Jade, que agiliza el proceso de creación de una interfaz Web. Jade proporciona un enfoque basado en plantillas para crear el código HTML, además de que contiene la orquestación código JavaScript que gestiona la comunicación entre el servidor y el navegador (cliente).
Tomados en conjunto, todos los paquetes que se hace referencia en figura 2 reducirá drásticamente la cantidad de código que tienes que escribir. Un buen desarrollador Node.js entiende el lenguaje y las capacidades incorporadas. Un gran desarrollador Node.js está familiarizado con los diversos paquetes y es hábil para utilizarlas eficazmente. Hazte un favor y familiarizarse con la biblioteca de módulos empaquetados Node.js en npmjs.org.
Figura 2 la comunicación bidireccional de la arquitectura de red
Lógica bidireccional
En última instancia, la orquestación entre cliente y servidor no es más que la lógica de estado máquina bidireccional. Por ejemplo, el cliente podría estar en un estado de espera para el código JavaScript o que puede estar en un estado de espera para los datos que serán recibidos.
El lado del servidor tendrá Estados correspondientes, tales como el Estado acreditante JavaScript o el Estado acreditante de datos. Se dará cuenta de las declaraciones en el código de Node.js, tales como "Socket.on ("un estado")," indicando que el servidor está esperando recibir una cadena mágica para provocar un cambio de estado (ver figura 3). Luego de responder adecuadamente a ese evento.
Figura 3 Listado parcial en App.js para configurar paquetes Node.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');
Empecemos por examinar el código de configuración para el servidor de Node.js -proceso. El flujo de trabajo se inicia cuando el servidor abre un puerto y espera para las conexiones. Tanto Express como Socket.io dejan el servidor escucha para conexiones entrantes de navegadores en Puerto 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);
Enviar JavaScript en el navegador
Una vez establecida la conexión, el servidor espera un mensaje de parte del cliente que indica que el cliente está preparado para recibir un código JavaScript a través de la conexión de Socket de Web. El código en la línea 9 en figura 4 representa el servidor espera para la conexión al lugar y para el cliente enviar la cadena "listo para el trabajo", que indica al servidor el JavaScript debe enviarse al cliente.
Figura 4 listado parcial de código del lado del servidor que distribuye JavaScript y datos a los navegadores de la red
(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) }
En este punto, estamos a mitad de camino. El cliente necesita solicitar los datos para procesar. El código es un código trigonométrico básico para calcular la distancia entre dos puntos utilizando coordenadas GPS. Se puede sustituir cualquier código JavaScript que quieras aquí.
El código en la segunda parte representa el estado en el cual el servidor espera la cadena "listo para datos" en línea 25 en figura 4. Esto es señal solicita del navegador datos. El JavaScript enviado previamente en la primera parte tratará estos datos. El código en la tercera parte representa el estado en el que el navegador del cliente ha terminado los cálculos sobre los datos enviados. Cuando el servidor recibe los resultados de la cadena en línea 41, está listo para incorporar el resultado final de este navegador para el trabajo informático. En este momento, el navegador puede enviarse otro trabajo más procesamiento, repitiendo el ciclo.
El motor de Jade
Jade es un productivo motor de vista y las plantillas HTML integrado en Node.js. Jade simplifica enormemente el marcado y JavaScript se escribe para el navegador. Figura 5 muestra el lenguaje de marcado de Jade que define la interfaz de usuario.
Figura 5 Jade define la interfaz de usuario
// 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');
});
En primer lugar, simplemente muestra el progreso del trabajo en el navegador. En segundo lugar, toma los datos enviados por el servidor y JavaScript. Esto representa el trabajo computacional que necesita para llevar a cabo. Se ejecuta el trabajo, devolver los resultados al servidor.
Si te has preguntado alguna vez cómo enviar JavaScript a un navegador para la ejecución, figura 5 representa el código que usted necesitará hacer esto. Si quieres saber más sobre obras como Jade, recomendamos esta explicación brillantemente simple en jade-lang.com. La conclusión es que se puede codificar una interfaz visual sin todas las difíciles etiquetas HTML, corchetes angulares y así sucesivamente.
Hay otros aspectos de este proyecto que no conseguimos la oportunidad de cubrir. Una de las piezas más grandes está en Server.js, donde vive la experiencia de portal y le permite seguir el progreso de todos los trabajos de la red en proceso. Incluye una hermosa interfaz de usuario que es 100% basada en Web. Es un tablero vivo y constante actualización, con tablas y gráficos. También no abordamos los aspectos prácticos de la seguridad y la amenaza de secuestro y modificando el JavaScript enviado al cliente y hacer daño.
Resumen
Usted puede adaptar todo esto por otros problemas de computación grid para fines generales. Creemos que la más importante de este artículo es la potencia y flexibilidad de Node.js. Los repositorios en GitHub para Node.js excedan de jQuery, un poderoso testimonio de cómo Node.js resuena con el desarrollador moderno de hoy.
Nos gustaría dar las gracias a la puesta en marcha y origen socio evangelistas, cuyo trabajo es con la ayuda de empresas y empresarios comprender y aprovechar la pila de Microsoft y tecnologías relacionadas, muchas de las cuales están abiertas. Warren Wilbee, gestor de arranque de la región oeste, había sembrado el equipo Tech Crunch interrumpir con algunos de sus mejores jugadores, incluyendo Felix Rieseberg, Helen Zeng, Steve Seow, Timothy Strimple y Will Tschumy.
Bruno Terkaly es desarrollador experto para Microsoft. Su profundo conocimiento se debe a años de experiencia en el campo, en que escribe código mediante el uso de diversas plataformas, lenguajes, marcos, SDK, bibliotecas y API. Gasta tiempo escribiendo código, blogging y dando presentaciones en vivo en la construcción de aplicaciones basadas en la nube, especialmente utilizando la plataforma Azure. Puede leer su blog en blogs.msdn.com/b/brunoterkaly.
Ricardo Villalobos es un arquitecto de software sazonada con más de 15 años de experiencia diseñando y creando aplicaciones para empresas en múltiples industrias. Sosteniendo diferentes certificaciones técnicas, así como una maestría en administración de empresas por la Universidad de Dallas, trabaja como arquitecto de nube en el equipo de DPE en todo el mundo socios comprometidos para Microsoft, ayudando a las empresas en todo el mundo para implementar soluciones en Azure. Usted puede leer su blog en blog.ricardovillalobos.com.
Terkaly y Villalobos presentan conjuntamente conferencias de la industria en general. Animan a los lectores de Azure Insider en contacto con ellos para disponibilidad. Terkaly puede ser contactado en bterkaly@microsoft.com y Villalobos puede ser contactado en Ricardo.Villalobos@microsoft.com.
Gracias a los siguientes expertos técnicos de Microsoft por su ayuda en la revisión de este artículo: Gert Drapers, Cort Fritz y Tim Park