.NET平台上的分布式编程框架MBrace发布1.0版本

jopen 9年前

来自:http://www.infoq.com/cn/news/2015/11/mbrace-distributed-programming

在经过数年的开发之后,MBrace 1.0终于在上周正式发布了。MBrace是一种使用F#及C#进行脚本编写与编程,适用于高伸缩性的云数据应用的编程模型。该项目主要包含了各种代码类库以及适配各种云供应商的运行时。

该项目的关键组件是MBrace.Core,这是一个独立的类库,包含了核心MBrace编程模型。它提供了一种基于API的计算表达式,调用者既可以直接使用这种表达式,也可以通过它创建其他类库,例如MBrace.Flow。以下示例将使用云工作流,展现如何通过HTTP调用获取远程内容。

let urls =  [| ("bing", "http://bing.com") ("google", "http://google.com") /* more urls*/ |]    let download (name: string, uri: string) =       cloud {          let webClient = new WebClient()          let! text = webClient.AsyncDownloadString(Uri(uri)) |> Cloud.OfAsync          do! CloudFile.Delete(sprintf "pages/%s.html" name)          let! file = CloudFile.WriteAllText(path = sprintf "pages/%s.html" name, text = text)          return file      }    let filesTask =       urls  |> Array.map download  |> Cloud.Parallel |> cluster.CreateProcess

MBrace.Flow是一个基于MBrace.Core创建的分布式流(Streaming)类库,该类库使用了函数式的管道声明。下面的示例展示了如何通过云流查找在多个CSV文件中出现重复字符串的次数。

let numberOfDuplicates =      CloudFlow.OfCloudFilesByLine ["container/data0.csv" ; "container/data1.csv"]      |> CloudFlow.map (fun line -> line.Split(','))      |> CloudFlow.map (fun tokens -> int tokens.[0], Array.map int tokens.[1 ..])      |> CloudFlow.groupBy (fun (id,_) -> id)      |> CloudFlow.filter (fun (_,values) -> Seq.length values > 1)      |> CloudFlow.length      |> cluster.Run

除了代码类库之外,MBrace中还包括了其他的主要组件,即MBrace运行时实现。目前该实现只支持Azure这一种云提供商,不过对AWS的支持已经在开发当中了。Azure运行时实现包括对MBrace.Core编程模型的完整支持,以及用于集群管理的辅助工具。以下代码展示了如何创建一个基于Azure平台上的四个A3实例的集群:

let pubSettingsFile = @"... path to your downloaded publication settings file ... "  let config = DeploymentManager.BeginDeploy(pubSettingsFile, Regions.North_Europe, VMSizes.A3, vmCount = 4) 

为了帮助使用者快速上手,MBrace提供了两个学习工具包:一个工具包对应Azure平台,而另一个工具包则对应一个模拟的集群。模拟集群可运行在一台单独的机器上,通过这种方式,就可以在某个开发者的机器上直接运行与调试分布式的代码,而无需依赖任何额外的基础设施了

MBrace是一个托管在GitHub平台上的开源项目,可以通过多种方式为该项目贡献你的力量:包括对类库的贡献、对云提供商运行时的贡献、以及对示例和文档的贡献。

查看英文原文:Release of MBrace 1.0, a Distributed Programming Framework for .NET