Orleans 2.0 官方文档 —— 7.2 流 -> 快速入门

Orleans Streams快速入门

本指南将向您展示设置和使用Orleans Streams的快速方法。要了解有关流功能详细信息的更多信息,请阅读本文档的其他部分。

必需的配置

在本指南中,我们将使用基于简单消息的Stream,它使用grain消息传递,将流数据发送给订阅者。我们将使用内存存储提供程序,来存储订阅列表,因此对于实际的生产应用程序来说,这不是明智的选择。

在silo上,hostBuilder是一个ISiloHostBuilder

hostBuilder.AddSimpleMessageStreamProvider("SMSProvider")
           .AddMemoryGrainStorage("PubSubStore");

在集群的客户端上,clientBuilder是IClientBuilder

clientBuilder.AddSimpleMessageStreamProvider("SMSProvider");

现在我们可以创建流,使用它们,可以作为生产者发送数据,也可以作为订阅者接收数据。

生成事件

为流生成事件相对容易。您应该首先访问您在上面的配置(SMSProvider)中定义的流提供程序,然后选择一个流,并将数据推送给它。

//Pick a guid for a chat room grain and chat room stream
var guid = some guid identifying the chat room
//Get one of the providers which we defined in config
var streamProvider = GetStreamProvider("SMSProvider");
//Get the reference to a stream
var stream = streamProvider.GetStream<int>(guid, "RANDOMDATA");

如您所见,我们的流具有一个GUID和一个命名空间。这样可以轻松识别唯一的流。例如,在聊天室中,命名空间可以是“Rooms”,GUID可以是拥有的RoomGrain的GUID。

这里我们使用一些已知聊天室的GUID。现在,使用流的OnNext方法,我们可以将数据推送给流。这里我们在定时器内使用随机数。您也可以为流使用任何其他的数据类型。

RegisterTimer(s =>
        {
            return stream.OnNextAsync(new System.Random().Next());
        }, null, TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(1000));

订阅和接收流数据

对于接收数据,我们可以使用隐式/显式订阅,这些订阅在本手册的其他页面中有详细描述。这里我们使用更简单的隐式订阅。当grain类型希望隐式订阅流时,它使用属性[ImplicitStreamSubscription (namespace)]

就我们的示例,我们将定义一个这样的ReceiverGrain:

[ImplicitStreamSubscription("RANDOMDATA")]
public class ReceiverGrain : Grain, IRandomReceiver

现在,每当一些数据被推送到命名空间为RANDOMDATA的流(如我们在定时器中的定义)时,具有与流相同的guid且类型为ReceiverGrain的一个grain,将会接收该消息。即使当前不存在该grain的激活体,运行时也会自动创建一个新的激活体,并将消息发送给它。

然而,为了使其工作,我们需要通过设置OnNext方法,来完成订阅过程以接收数据。所以我们的ReceiverGrain应该调用它的OnActivateAsync,类似于这样:

//Create a GUID based on our GUID as a grain
var guid = this.GetPrimaryKey();
//Get one of the providers which we defined in config
var streamProvider = GetStreamProvider("SMSProvider");
//Get the reference to a stream
var stream = streamProvider.GetStream<int>(guid, "RANDOMDATA");
//Set our OnNext method to the lambda which simply prints the data, this doesn't make new subscriptions
await stream.SubscribeAsync<int>(async (data, token) => Console.WriteLine(data));

我们现在都准备好了。唯一的要做的是,触发我们的生产者grain的创建,然后,它会注册定时器,并开始向所有的相关方发送随机整数。

同样,本指南跳过了大量细节,只展示了大致步骤。阅读本手册的其他部分和RX上的其他资源,以便更好地了解哪些内容可用、以及如何使用。

响应式编程(Reactive programming )是解决许多问题的一种非常有效的方法。例如,您可以在订阅者中使用LINQ来过滤数字,并做各种有趣的事情。

下一步

Orleans 流编程API

你可能感兴趣的:(Orleans)