Orleans 2.0 官方文档 —— 7.3 流 -> 为什么需要Orleans流

为什么需要Orleans流?

已有多种技术可用于构建流处理系统。这些包括用于持久存储流数据的系统(例如,Event HubsKafka),和流数据上表达计算操作的系统(例如,Azure Stream AnalyticsApache StormApache Spark Streaming)。这些都是很棒的系统,可以帮助您构建高效的数据流处理管道。

现有系统的局限性

但是,这些系统不适用于细粒度的、自由形式的流数据的计算。上面提到的流计算系统,都允许您指定一个操作的统一数据流图,它以相同地方式应用于所有流项。当数据是一致的,且您希望对此数据表达相同的转换、过滤或聚合操作集时,这是一个强大的模型。但是在其他用例中,您需要对不同的数据项表达根本不同的操作。在其中的一些应用程序中,作为处理的一部分,您偶尔需要进行外部调用,例如调用一些任意REST API。统一的数据流处理引擎要么不支持这些场景,要么以有限和受限的方式支持它们,要么支持它们效率低下。这是因为它们本身针对大量类似的数据项进行了优化,并且通常在表现力、处理方面受到限制。Orleans 流针对的是其他场景。

动机

这一切都始于Orleans的用户,他们请求支持从grain方法调用返回一系列的条目。可以想象,这只是冰山一角。他们实际上需要的远不止这些。

Orleans 流的一个典型场景是,当您拥有每个用户的流,并且您希望在单个用户的上下文中,为每个用户执行不同的处理。我们可能有数百万计的用户,但其中一些用户对天气感兴趣,可以订阅特定位置的天气警报,而有些用户对体育赛事感兴趣;有人正在跟踪特定航班的状态。处理这些事件需要不同的逻辑,但您不希望运行两个独立的流处理实例。有些用户仅对特定库存感兴趣,并且只有在某些外部条件适用时,这些条件可能不一定是流数据的一部分(因此需要在运行时作为处理的一部分进行动态检查)。

用户始终在改变他们的兴趣,因此他们对特定事件流的订阅,会动态地来了又去了,因此,流拓扑会动态地、快速地变化。最重要的是,每个用户的处理逻辑,也会根据用户状态和外部事件,进行动态地进化和改变。外部事件可以修改特定用户的处理逻辑。例如,在游戏作弊检测系统中,当发现一种新的作弊方式时,需要用新规则更新处理逻辑,以检测这种新的违规行为。当然,这需要在不中断正在进行的处理流程的情况下完成。批量数据流处理引擎的构建不支持此类场景。

毫无疑问,一个这样的系统,必须在许多联网的机器上运行,而不是在单个节点上运行。因此,处理逻辑必须以可伸缩和弹性的方式,部署在服务器集群中。

新的要求

我们确定了流处理系统的4个基本要求,使其能够针对上述场景。

  1. 灵活的流处理逻辑
  2. 支持高动态拓扑
  3. 细粒度的流粒度
  4. 部署

灵活的流处理逻辑

我们希望系统支持表达流处理逻辑的不同方式。我们上面提到的现有系统,要求开发人员编写一个声明性的数据流计算图,通常是按照函数式编程风格编写的。这限制了处理逻辑的表现力和灵活性。Orleans流对处理逻辑的表达方式漠不关心。它可以表示为一个数据流(例如,使用在.NET中的Reactive Extensions(Rx));表示为一个功能程序;表示为一个声明性的查询;或者在一个一般的命令逻辑中。逻辑可以是有状态的或无状态的,可能有、也可能没有副作用,并且可以触发外部动作。所有的权力都交给了开发者。

支持动态拓扑

我们希望系统允许动态地进化拓扑。我们上面提到的现有系统,通常仅限于静态拓扑,它在部署时固定且不能在运行时进化。在下面的数据流表达式示例中,在您需要更改它之前,一切都很好且很简单。

Stream.GroupBy(x=> x.key).Extract(x=>x.field).Select(x=>x+2).AverageWindow(x, 5sec).Where(x=>x > 0.8) *

更改Where过滤器中的阈值条件,添加额外的Select语句,或在数据流图中添加另一个分支并生成新的输出流。在现有系统中,如果不拆除整个拓扑,并从头开始重新启动数据流,这是不可能的。实际上,那些现有的系统将检查现有的计算,并能够从最新的检查点重新启动。尽管如此,这种重新启动对于实时产生结果的在线服务来说是破坏性的,并且代价高昂。当我们考虑大量这样的表达式,以类似的方式被执行但参数(每用户,每个设备等)不同,并且参数不断变化时,这种重新启动变得特别地不切实际。

我们希望系统,允许在运行时通过向计算图中添加新的链接或节点,或通过更改计算节点内的处理逻辑,来进化流处理图。

细粒度的流粒度

在现有系统中,最小的抽象单元通常是整个流(拓扑)。但是,我们的许多目标场景,都要求拓扑中的单个节点/链路本身就是一个逻辑实体。这样,每个实体都可以独立管理。例如,在包括多个链路的大的流拓扑中,不同的链路可以具有不同的特性,并且可以在不同的物理传输上实现。一些链接可以通过TCP套接字,而其他链接可以通过可靠的队列。不同的链接可以有不同的交付保证。不同的节点可以具有不同的检查点策略,并且它们的处理逻辑可以用不同的模型或甚至不同的语言来表达。这种灵活性在现有系统中通常是不可能实现的。

抽象和灵活性参数的单位,类似于SoA(面向服务的体系结构)与Actors的比较。Actor系统允许更大的灵活性,因为每个系统本质上都是一个独立管理的“极小服务”。同样,我们希望系统允许这样的细粒度控制。

部署

当然,我们的系统应具有“良好的分布式系统”的所有属性。包括:

  1. 可伸缩性 - 支持大量流和计算元素。
  2. 弹性 - 允许根据负载添加/删除资源,来增长/收缩。
  3. 可靠性 - 对故障有弹性
  4. 效率 - 有效地利用潜在的资源
  5. 响应性 - 启用接近实时性的方案。

这些是我们为构建Orleans流而考虑的要求。


说明:Orleans目前不直接支持像上面的示例那样编写声明性数据流表达式。当前的Orleans流API是更低级别的构建块,如这里的描述。提供声明性数据流表达式是我们未来的目标。

下一步

Orleans 流编程API

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介 本书将尝试帮助入门级、中级以及高级读者理解基本的分布式计算概念,并且展示 如何使用 Akka 来构建具备高容错性、可以横向扩展的分布式网络应用程序。Akka 是一 个强大的工具集,提供了很多选项,可以对在本地机器上处理或网络远程机器上处理的 某项工作进行抽象封装,使之对开发者不可见。本书将介绍各种概念,帮助读者理解 网络上各系统进行交互的困难之处,并介绍如何使用 Akka 提供的解决方案来解决这些 问题。 作者简介 Jason Goodwin 是一个基本上通过自学成才的开发者。他颇具企业家精神,在学校 学习商学。不过他从 15 岁起就开始学习编程,并且一直对技术保持着浓厚的兴趣。这对 他的职业生涯产生了重要的影响,从商学转向了软件开发。现在他主要从事大规模分布 式系统的开发。在业余时间,他喜欢自己原创电子音乐。 他在 mDialog 公司第一次接触到 Akka 项目。mDialog 是一家使用 Scala/Akka 的公司, 为主出版商提供视频广告插入软件。这家公司最终被 Google 收购。他同时还是一名很 有影响力的“技术控”,将 Akka 引入加拿大一家主要的电信公司,帮助该公司为客户提 供容错性更高、响应更及时的软件。除此之 外,他还为该公司中的一些团队教授 Akka、 函数式以及并发编程等知识。 目录 第 1 章 初识 Actor:Akka 工具集以及 Actor 模型的介绍。 第 2 章 Actor 与并发:响应式编程。Actor 与 Future 的使用。 第 3 章 传递消息:消息传递模式。 第 4 章 Actor 的生命周期—处理状态与错误:Actor 生命周期、监督机制、Stash/ Unstash、Become/Unbecome 以及有限自动机。 第 5 章 纵向扩展:并发编程、Router Group/Pool、Dispatcher、阻塞 I/O 的处理以 及 API。 第 6 章 横向扩展—集群化:集群、CAP 理论以及 Akka Cluster。 第 7 章 处理邮箱问题:加大邮箱负载、不同邮箱的选择、熔断机制。 第 8 章 测试与设计:行为说明、领域驱动设计以及 Akka Testkit。 第 9 章 尾声:其他 Akka 特性。下一步需要学习的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值