原文链接:http://blogs.msdn.com/b/masimms/archive/2010/07/23/secundus-posting-of-sorts.aspx
原文作者:Mark Simms,微软SQL客户咨询小组高级程序经理。
(由于原文有一些过时的且不相关的话,我做了一些删节和重写,固将标题定为了“编译”,而不是“翻译”,两者的区别可以见这里。)
有段时间没有在这里发表新文章了(好吧,坦白说是很长时间没发表了)。自从09年开始,我在微软的角色就有了一些微妙的转变。我将坐镇SQL客户咨询小组(SQL Customer Advisory Team),负责利用StreamInsight技术帮助客户和合作伙伴更好地构建大规模的事件驱动应用。
随着StreamInsight作为SQL Server 2008 R2的子集发布,我终于在结束几个惊人的项目之后,空出了足够的时间来谈一谈我们在这个产品中学到的最佳实践,同时也希望分享一些有价值的信息来帮助大家更好地构建自己的StreamInsight应用。
好吧,让我们一起来看看StreamInsight 吧!
什么是StreamInsight?
熟悉我或者听过我演讲的朋友都知道我爱打比方(虽然有的时候比方的很烂),这里也不例外。注意:我这里举的例子都是人为设定的,文章后面我们会谈到一些真实的场景。
假如我们要回答这么一个问题——“有多少量红色轿车停在你办公室后面的停车场里?”,那么利用物理方式和关系数据库的方式可以这么回答:
物理方式 | 关系数据库 |
|
|
非常直接的做法!我们可以继续思考怎么优化这个查询,例如先把所有的车都停在停车场的一边,然后根据颜色来安排停靠(在关系数据库中,我们可以考虑增加一个索引)。可以看出对于此类问题,我们已经有了一个不错的关系数据库平台。然而,还有一类问题关系数据库引擎并没有能够很好的进行处理。
假设现在的问题变为——“在最近的20分钟内,高速公路上有多少量车经过了你的办公室?”。类似地,我们分别采用物理方式和纯粹的关系数据库的方式来进行回答,那么结果会是:
物理方式 | 关系数据库 |
|
|
可以看出,上面的两个做法都不是回答这个问题的最佳办法。StreamInsight正好填补了这个空白——它通过提供流处理平台可以有效的处理大规模流数据。同样的问题用StreamInsight来解决会是这样:
物理方式 | StreamInsight |
|
|
var x = from e in cars where e.Type == "AUTO" && e.Color == "RED" select e; var count = from e in x.HoppingWindow( TimeSpan.FromMinutes(2), TimeSpan.FromSeconds(30), HoppingWindowOutputPolicy.ClipToWindowEnd) select new { count = e.Count() };
上面的LINQ语句是一个StreamInsight查询,它的操作过程如下:
- 查看包含待观察车辆的流数据(cars流);
- 过滤掉任何不是AUTO(机动车)或不是RED(红色)车辆的事件;
- 定义窗口时间查看最近的2分钟事件,并将窗口以30秒的间隔向前移动;
- 在每一个窗口中,统计事件总数(也就是统计最近2分钟内的红色汽车数量),并报告总计。
额,等等,想知道LINQ是怎么神奇的解决了传输中的数据问题的吗?哈哈,这就是STreamInsight的神奇之处。它提供的平台包括了:
- 内存中的流处理引擎;
- 连接流数据源(适配器)进行持续不断的查询;
- 询问临时数据和关联数据(某个时间内的窗口,某个时间内的关联关系),包括动态的链接和组合查询;
- 针对查询(queries),操作符(operators),聚合(aggregates)和数据联通性(data connectivity)的扩展。
StreamInsight有什么用?
StreamInsight是设计用来帮助用户开发强有力的大规模事件处理应用。这也决定了它可以适用于许多不同的工业领域,例如:
制造业 |
|
金融服务 |
|
操作分析 |
|
公用事业 |
|
基本上来说,StreamInsight适用于那些具有大量流数据且需要较低滞后时间得到处理结果的应用。
听起来不错,怎么着手?
想要着手StreamInsight,你需要熟悉C#和LINQ,并且要有Visual Studio(2008或2010)。一旦把这些准备好,你就可以开始了:
- 从Microsoft 下载中心下载安装StreamInsight 当前最新版本1.2; 注:客户端文件(Microsoft® StreamInsight Client package)仅仅安装Microsoft® StreamInsight的一个子集,它仅允许用户编写客户端相关的功能:连接已有的StreamInsight服务器、管理查询和使用调试工具。它不支持允许内置服务器或创建StreamInsight服务。此外,安装Microsoft® StreamInsight Client不需要产品密钥。
- 从codeplex下载参考样例到本机硬盘;
- 由于codeplex下载下来的文件(网上下载的文件大多如此)默认情况下是不可信的,你需要首先“解除锁定”,然后再解压文件夹;
- 右击StreamInsightProductTeamSamples压缩包,点击“属性”,你会看到:
- 点击“解除锁定”。
- 从Visual Studio中打开Applications\TrafficJoinQuery\TrafficJoinQuery.sln解决方案;
- TrafficJoinQuery应用使用模拟的交通数据(就是解决方案包含的那两个.csv文件),执行CreateQueryTemplate函数(在Program.cs文件中)中列出的查询;
- 按下F5键调试,应用程序会在两个模拟数据流上执行查询,运行结果类似如下:
Creating CEP Server
Creating CEP Application
Registering LINQ query template
Registering Adapter Factories
Registering bound query
Start query
INSERT 6/25/2009 12:00:00 AM +00:00 1 1001 18
INSERT 6/25/2009 12:00:00 AM +00:00 1 1003 19-- snip --
NSERT 6/25/2009 12:18:20 AM +00:00 2 1004 21
INSERT 6/25/2009 12:18:20 AM +00:00 2 1005 19
INSERT 6/25/2009 12:18:20 AM +00:00 2 1006 21
INSERT 6/25/2009 12:18:20 AM +00:00 3 1007 22
CTI 12/31/9999 11:59:59 PM +00:00Diagnostic View for 'cep:/Server/EventManager':
AllEventsCount: 18
AllEventsMemory: 417792
Diagnostic View for 'cep:/Server/PlanManager':-- snip --
QueryTotalIncomingEventCount: 497
QueryTotalConsumedEventCount: 497
QueryTotalProducedEventCount: 192
QueryTotalOutgoingEventCount: 192
-- snip --
还有什么学习资料?
接下去我会发表一系列的博文来讨论如何构建StreamInsight应用的方方面面,包括适配器开发,查询编写,托管StreamInsight,连接到其他技术平台(如AppFabric Cache)等等。现在我先给出一些非常不错的参考链接供您参考学习: