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来过滤数字,并做各种有趣的事情。