Orleans 2.0 官方文档 —— 7.5 流 -> 流提供程序

流提供程序

流可以有不同的形状和形式。有些流可以通过直接TCP链接传递事件,而另一些流可以通过持久队列传递事件。不同的流类型可以使用不同的批处理策略、不同的缓存算法或不同的反压程序。我们不希望将流应用程序限制为这些行为选择的一个小的子集。相反,流提供程序是Orleans流运行时的可扩展点,允许用户实现任何类型的流。这个可扩展点在本质上与Orleans存储提供程序类似。Orleans目前附带许多流提供程序,包括:简单消息流提供程序和Azure队列流提供程序。

简单消息流提供程序

简单消息流提供程序(也称为SMS提供程序),通过使用常规的Orleans grain消息,在TCP上传递事件。由于SMS中的事件,是在不可靠的TCP链接上传递的,因此SMS保证可靠的事件传递,也不自动为SMS流重新发送失败的信息。SMS流的生产者有一种方法可以知道其事件是否已成功接收和处理:默认情况下,对stream.OnNextAsync的调用,返回一个Task表示流消费者的处理状态。如果此Task失败,则生产者可以决定再次发送相同的事件,从而在应用程序级别上实现可靠性。虽然单独的流消息的传递是尽力服务,但SMS流本身是可靠的。也就是说,Pub Sub执行的订阅者到生产者的绑定是完全可靠的。

Azure队列(AQ)流提供程序

Azure Queue(AQ)流提供程序通过Azure队列传递事件。在生产者端,AQ流提供程序将事件直接压入Azure队列。在消费者端,AQ流提供程序管理一组拉取代理,这些代理从一组Azure队列中拉取事件,并将事件传递给使用它们的应用程序代码。可以将拉取代理视为一个分布式的“微服务” —— 一个分区的、高度可用、弹性的分布式组件。拉取代理运行在承载应用程序grain的相同silo内。因此,无需运行单独的Azure工作者角色来从队列中拉取。拉取代理的存在、它们的管理、反压、平衡它们之间的队列以及将队列从故障的代理移交给另一个代理,都是由Orleans流运行时完全管理的,并且对使用流的应用程序代码是透明的。

队列适配器

为使在持久队列上传递事件的不同流提供程序表现出类似的行为,并且遵循类似的实现。因此,我们提供了一个通用的可扩展的PersistentStreamProvider,它允许开发人员编写不同类型的队列的插件,而无需从头编写一个全新的流提供程序。 PersistentStreamProvider使用一个IQueueAdapter组件,该组件抽象出特定的队列实现细节,并提供压入队列和弹出队列事件的方法。其余的都由PersistentStreamProvider内部的逻辑来处理。上面提到的Azure队列提供程序也是以这种方式实现的:它是一个PersistentStreamProvider的实例,此实例使用了AzureQueueAdapter

下一步

Orleans 流实现细节

你可能感兴趣的:(Orleans)