Orleans 流式处理是 Orleans 框架的一项功能,使开发人员能够编写响应式应用程序,以结构化的方式处理事件序列。 Orleans 流式处理提供了一组抽象和 API,使思考和使用流更简单、更可靠。 流是始终存在的逻辑实体,永远无法失败。 流由其 StreamId标识。 流允许在时间和空间中将数据生成与其处理分离。 数据流可以在颗粒和Orleans客户端之间统一工作,并能兼容且可移植于各种现有的队列技术,如事件中心、ServiceBus、Azure 队列和 Apache Kafka。 Orleans 流式处理还支持动态流绑定、透明流消耗生命周期管理和可扩展流提供程序。
Orleans v.1.0.0 添加了对编程模型流扩展的支持。 流式处理扩展提供了一组抽象和 API,使涉及流的思考和操作更加简单且更为可靠。 流式扩展允许开发人员编写以结构化方式对事件序列进行操作的响应式应用程序。 流提供程序的扩展性模型使编程模型与各种现有队列技术(如 事件中心、 ServiceBus、 Azure 队列和 Apache Kafka)兼容和可移植。 无需编写特殊代码或运行专用进程来与此类队列进行交互。
我为什么要关心?
如果你已经了解了 流处理 的全部知识,并且熟悉了 .NET 中的 事件中心、 Kafka、 Azure 流分析、 Apache Storm、 Apache Spark 流式处理和 反应式扩展(Rx)等技术,你可能会问为什么应该注意。 为什么我们需要又一个流处理系统,以及参与者如何与流相关?“为什么是 Orleans 流?”意在回答这个问题。
编程模型
流编程模型背后 Orleans 有几个原则:
- Orleans 流是 虚拟的。 也就是说,流始终存在。 它不会被明确创建或销毁,也永远不会出错。
- 流通过流 ID 标识,这些 ID 只是由 GUID 和字符串组成的 逻辑名称。
- Orleans 通过流,可以在 时间和空间中将生成数据与处理分离。 这意味着流生成者和流使用者可能位于不同的服务器或不同的时区,并能够承受故障。
- Orleans 流是 轻量级和动态的。 Orleans 流式处理运行时被设计用于处理在高频率下启动和停止的大量流。
- Orleans 流 绑定是动态的。 Orleans 流式处理运行时旨在处理粒度以高速率连接到流并从流断开连接的情况。
- Orleans 流运行时 以透明方式管理流消耗的生命周期。 应用程序订阅流后,即可接收流的事件,即使存在故障。
- Orleans 数据流 在不同的粒度和 Orleans 客户端之间统一工作。
快速入门示例
快速入门示例很好地概述了在应用程序中使用流的整体工作流。 阅读后,应阅读 Streams 编程 API ,以便更深入地了解这些概念。
流媒体服务商
流可以通过各种形状和形式的物理通道来,并且可以具有不同的语义。 Orleans 流式处理旨在通过 流提供程序的概念来支持这种多样性,这是系统中的扩展点。
Orleans 提供了多种流提供程序的实现:
Orleans 当前包括多个提供程序实现:
- 简单信息(SMS),它使用直接粒度调用且没有后备存储系统,
- Azure 队列,它使用 Azure 存储队列来存储消息,以及
- Azure EventHubs,其中使用了 Azure EventHubs
有关详细信息,请参阅 流提供程序。
流语义
流订阅语义:
Orleans流保证流订阅操作的顺序一致性。 具体而言,当消费者订阅一个流时,一旦表示订阅操作的Task
成功解决,消费者就会看到所有在订阅后生成的事件。 此外,可回放的流允许你通过使用StreamSequenceToken从过去的任意时间点订阅。 有关详细信息,请参阅 Orleans 流媒体提供商。
单个流事件交付保证:
个别事件交付的保障取决于各个流服务提供商。 有些(如7.0版本之前的简单消息流 (SMS),在 7.0 版本后称为广播频道)仅提供最多一次传递,而另一些(如 Azure 队列流)则提供至少一次的传送。 甚至可以建立一个流服务提供商,该提供商可以保证精确一次交付。
事件传递顺序:
事件顺序还取决于特定的流提供程序。 在 SMS 流中,生成者通过控制发布事件的方式,显式控制使用者看到的事件顺序。 Azure 队列流不能保证 FIFO 顺序,因为基础 Azure 队列不能保证故障情况下的顺序。 应用程序还可以使用 StreamSequenceToken 控制其流传送顺序。
流实现
StreamsOrleans 实现提供内部实现的高级概述。
代码示例
可以在 SampleStreamingGrain.cs找到有关如何在粒度中使用流式处理 API 的更多示例。