Orleans 2.0 官方文档 —— 7.1 流 -> 概述

Orleans流

Orleans v.1.0.0增加了对编程模型流扩展的支持。流扩展提供了一组抽象和API,使得考虑和使用流更简单、更健壮。流扩展允许开发人员以结构化的方式,编写对一系列事件进行操作的响应式应用程序。流提供程序的可扩展性模型,使编程模型与各种现有的队列技术兼容并可移植,例如Event Hub,ServiceBus,Azure Queues和Apache Kafka。无需编写特殊代码或运行专用进程,来与此类队列进行交互。

我为什么要在意它?

如果您已经了解关于流处理的一切,并且熟悉.NET中的事件中心,Kafka,Azure流分析,Apache Storm,Apache Spark Streaming和Reactive Extensions(Rx)等技术,您可能会问为什么应该在意Orleans流。为什么我们还需要另一个流处理系统以及Actors如何与Streams相关? “为什么应该在意Orleans流?” 是为了回答这个问题。

编程模型

Orleans流的编程模型背后有许多原则。

  1. Orleans流是虚拟的。也就是说,流始终存在。它不是显式地创建或销毁的,并且永远不会失败。
  2. 流ID 标识,流ID只是由GUID和字符串组成的逻辑名称
  3. Orleans Streams允许在时间和空间上将数据的生成与处理进行解耦。这意味着流生产者和流消费者可能在不同的服务器上、在不同的时间,并能承受故障。
  4. Orleans流是轻量级且动态的。Orleans Streaming Runtime旨在处理大量的、高速进出的流。
  5. Orleans流的绑定是动态的。Orleans Streaming Runtime旨在处理grain高速地连接到流和从流断开的情况。
  6. Orleans Streaming Runtime 透明地管理流消费的生命周期。在应用程序订阅一个流之后,从该时间点起,它将接收流的事件,即使存在故障的情况下,也是如此。
  7. Orleans在grain和Orleans客户端之间以一致地方式进行工作

编程API

应用程序通过API与流进行交互,这些API与众所周知的.NET中的Reactive Extensions(Rx)非常相似,它们使用了Orleans.Streams.IAsyncStream,此接口实现了
Orleans.Streams.IAsyncObserver和 Orleans.Streams.IAsyncObservable接口。

在下面的典型示例中,设备生成一些数据,这些数据作为HTTP请求发送到在云中运行的服务。在前端服务器中运行的Orleans客户端,接收此HTTP调用,并将数据发布到匹配的设备流中:

public async Task OnHttpCall(DeviceEvent deviceEvent)
{
     // Post data directly into device's stream.
     IStreamProvider streamProvider = GrainClient.GetStreamProvider("myStreamProvider");
     IAsyncStream deviceStream = streamProvider.GetStream(deviceEvent.DeviceId);
     await deviceStream.OnNextAsync(deviceEvent.Data);
}

在下面的另一示例中,聊天用户(实现为Orleans Grain)加入聊天室,获取该房间中的所有其他用户生成的聊天消息流的句柄,并订阅它。请注意,聊天用户既不需要知道聊天室grain本身(我们的系统中可能没有这样的grain),也不需要知道该组中产生消息的其他用户。毋庸直言,要生成聊天流,用户不需要知道谁当前订阅了流。这演示了聊天用户如何在时间和空间上完全解耦。

public class ChatUser: Grain
{
    public async Task JoinChat(string chatGroupName)
    {
       IStreamProvider streamProvider = base.GetStreamProvider("myStreamProvider");
       IAsyncStream<string> chatStream = streamProvider.GetStream<string>(chatGroupName);
       await chatStream.SubscribeAsync((string chatEvent) => Console.Out.Write(chatEvent));
    }
}

快速入门示例

该快速入门范例很好地快速概述了在应用程序中使用流的总体工作流程。在阅读之后,您应该阅读流编程API,以更深入地理解这些概念。

Streams编程API

一个流编程API,提供了API编程的详细说明。

流提供程序

流可以从各种形状和形式的物理通道来,并且可以具有不同的语义。Orleans Streaming旨在通过流提供程序(它是系统中的可扩展点)的概念来支持这种多样性。Orleans目前实现了两个流提供程序:基于TCP的简单消息流提供程序(SMS)和基于Azure QueueAzure队列流提供程序。有关Steam提供商的更多详细信息,请访问流提供程序。

流语义

流订阅语义:Orleans流能保证流订阅的顺序一致性。具体而言,当消费者订阅流时,一旦代表订阅操作的Task被成功处理,消费者将看到在订阅之后生成的所有事件。此外,可回滚流,允许通过使用StreamSequenceToken,从过去的任意时间点订阅(更多细节可在此处找到)。

单独的流事件传递保证:单独的事件传递保证取决于各个流提供程序。有些只提供最多一次传递(例如简单消息流),而另一些提供至少一次传递(如Azure队列流)。甚至可以构建一个保证一次交付的流提供程序(我们还没有这样的提供程序,但是可以构建一个)。

事件传递顺序:事件顺序也取决于特定的流提供程序。在SMS流中,生产者通过控制时间的发布方式,显式地控制消费者看到的事件的顺序。Azure队列流不保证FIFO顺序,因为底层Azure队列不保证在失败情况下的顺序。应用程序还可以通过使用StreamSequenceToken,来控制自己的流传输顺序。

流的实现实施

在Orleans流的实现中,提供了内部实现的高度概括。

代码示例

可以在此处找到有关如何在grain中使用流API的更多示例。我们计划在未来创建更多示例。

更多资料

  • 关于流的Orleans虚拟聚会
  • 来自虚拟聚会中的Orleans流的演示文稿

你可能感兴趣的:(Orleans)