Azure Insider

Microsoft Azure 和开源网格计算

Bruno Terkaly
Ricardo Villalobos

Bruno Terkaly and 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。若要了解有关使用 Visual Studio 的 Node.js 的更多信息,请查阅布鲁诺的博客张贴内容,"越来越开始与 Node.js 和 Visual Studio"(bit.ly/1gzKkbj)。

专注于 App.js

我们创建的最终解决方案实际上有两个服务器端进程。第一次和最明显的服务器端进程是那个是大型计算作业分成更小的碎片和分发工作和对连接的客户端浏览器的数据。您可以在 App.js 中找到该代码。

有一个提供一个门户网站的第二个服务器端进程管理的经验和查看大型计算作业执行的网格上。您可以在 Server.js 中找到该代码。它提供了一个实时仪表板的经验,完成与活更新图形和数字通过浏览器 (见图 1)。我们列将重点的 App.js 代码。

High-Level Grid Architecture
图 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 包装模块库。

The Bidirectional Communication of Grid Architecture
图 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、 海伦曾、 史蒂夫以英语发言、 蒂莫西 · Strimple Will Tschumy 的一些科技紧缩破坏团队。

Bruno Terkaly 是 Microsoft 的开发推广人员。他的知识深度来源于多年来相关领域以及使用大量平台、语言、框架、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 弗里茨和蒂姆 · 公园