.NET分布式Orleans - 7 - Streaming
概念
在Orleans中,Streaming是一组API和功能集,它提供了一种构建、发布和消费数据流的方式。
这些流可以是任何类型的数据,从简单的消息到复杂的事件或数据记录。Streaming API允许你定义、发布和消费这些流,而无需关心底层的传输机制或数据存储。
每个流都有一个唯一的标识符,称为StreamId,用于区分不同的流。流可以是持久的,也可以是临时的,具体取决于所使用的流提供者(Stream Provider)。流提供者负责处理流的存储、传输和故障恢复。
作用
Streaming在Orleans中起到了至关重要的作用,主要体现在以下几个方面:
解耦:Streaming允许将数据的产生者和消费者解耦。生产者可以发布数据到流中,而消费者可以独立地订阅这些流并处理数据。这种解耦使得系统更加灵活和可扩展。
实时性:通过Streaming,你可以实时地处理和响应数据流。这对于需要实时分析、监控或响应的场景非常有用。
故障恢复:Orleans的Streaming机制具有强大的故障恢复能力。即使在出现网络分区或节点故障的情况下,流提供者也能够确保数据的可靠性和一致性。
应用场景
实时日志分析:你可以将应用程序的日志消息发布到流中,并使用专门的消费者来分析这些日志。这允许你实时地监控和响应应用程序的行为。
事件驱动架构:在事件驱动架构中,你可以使用Streaming来发布事件,并由多个消费者来处理这些事件。这有助于构建松耦合、可扩展和响应式的系统。
分布式协作:Streaming也可以用于实现分布式系统中的协作和通信。例如,多个节点可以发布状态更新到流中,其他节点可以订阅这些流以获取最新的状态信息。
示例
安装nuget包
<PackageReference Include="Microsoft.Orleans.Streaming" Version="8.0.0" />
配置Streaming
siloHostBuilder.AddMemoryStreams("StreamProvider").AddMemoryGrainStorage("PubSubStore");
定义一个Grain生成事件
public interface ISender : IGrainWithStringKey
{
Task Send(Guid rid);
} public class SenderGrain : Grain, ISender
{
public Task Send(Guid rid)
{
var streamProvider = this.GetStreamProvider("StreamProvider");
var streamId = StreamId.Create("RANDOMDATA", rid);
var stream = streamProvider.GetStream<int>(streamId);
RegisterTimer(_ =>
{
return stream.OnNextAsync(Random.Shared.Next());
}, null, TimeSpan.FromMilliseconds(1_000), TimeSpan.FromMilliseconds(1_000));
return Task.CompletedTask;
}
}
再定义一个Grain订阅事件
public interface IRandomReceiver : IGrainWithGuidKey
{
Task Receive();
} [ImplicitStreamSubscription("RANDOMDATA")]
public class ReceiverGrain : Grain, IRandomReceiver
{
public override async Task OnActivateAsync(CancellationToken cancellationToken)
{
var streamProvider = this.GetStreamProvider("StreamProvider");
var rid = this.GetPrimaryKey();
var streamId = StreamId.Create("RANDOMDATA", rid);
var stream = streamProvider.GetStream<int>(streamId); await stream.SubscribeAsync<int>(
async (data, token) =>
{
Console.WriteLine(data);
await Task.CompletedTask;
});
base.OnActivateAsync(cancellationToken);
}
public async Task Receive()
{ }
}
然后即可测试
var rid = Guid.NewGuid();
var sender1 = client.GetGrain<ISender>("sender1");
await sender1.Send(rid);
var reciver1 = client.GetGrain<IRandomReceiver>(new Guid());
await reciver1.Receive();
流提供程序
提供程序可以通过在nuget种搜索Orleans.Streaming,也可以通过PersistentStreamProvider 与 IQueueAdapter 重写来自定义Provider

.NET分布式Orleans - 7 - Streaming的更多相关文章
- INFO JobScheduler: Added jobs for time 1524468752000 ms/INFO MemoryStore: Block input-0-1524469143000 stored as bytes in memory/完全分布式 ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行
1.完全分布式 ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行: 1 [hadoop@slaver1 spark- ...
- Spark小课堂Week2 Hello Streaming
Spark小课堂Week2 Hello Streaming 我们是怎么进行数据处理的? 批量方式处理 目前最常采用的是批量方式处理,指非工作时间运行,定时或者事件触发.这种方式的好处是逻辑简单,不影响 ...
- Orleans简单配置
Orleans简单配置 这是Orleans系列文章中的一篇.首篇文章在此 话说曾几何时,我第一次看到xml文件,心中闪过一念想:"这<>是什么鬼?"-用ini或者jso ...
- Java自学教程视频
BAT大咖助力 全面升级Android面试 BAT大牛亲授 基于ElasticSearch的搜房网实战 从天气项目看Spring Cloud微服务治理 Java企业级电商项目架构演进之路 Tomca ...
- 优秀 .NET 开源项目集锦
Github 地址: https://github.com/jasonhua95/awesome-dotnet-core awesome-dotnet-core .NET Core框架.库和软件的中文 ...
- 在 Intenseye,为什么我们选择 Linkerd2 作为 Service Mesh 工具(Part.2)
在我们 service mesh 之旅的第一部分中,我们讨论了"什么是服务网格以及我们为什么选择 Linkerd2?".在第二部分,我们将讨论我们面临的问题以及我们如何解决这些问题 ...
- Microsoft Orleans构建高并发、分布式的大型应用程序框架
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- 一种基于Orleans的分布式Id生成方案
基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerat ...
- 微软分布式云计算框架Orleans(1):Hello World
自从写了RabbitHub框架系列后的一段时间内一直在思索更加轻量简便,分布式高并发的框架(RabbitHub学习成本较高),无意间在网上级联看到了很多新框架:从helios到Akka.NET在到Or ...
- 微软分布式云计算框架Orleans(2):容灾与集群(1)
在上一篇:微软分布式云计算框架Orleans(1):Hello World,我们大概了解了Orleans如何运用,当然上一篇的例子可以说是简单且无效的,因为用了Orleans不可能只写一个Hello ...
随机推荐
- Centos7虚拟机安装后的环境配置工作
虚拟机安装配置 选择[基础设施服务器],勾选:开发工具和调试工具 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld. ...
- oracle goto语句介绍
以下内容来自oracle plsql user guide. ------------------------------------------------------- 一 定义: The Ora ...
- Mac M1 在PyCharm中安装(支持GPU)TensorFlow 方法
本文介绍在Mac M1的PyCharm中安装TensorFlow与创建工程的方法,在2021的MacBook Pro (M1 Max处理器)验证OK. 安装TensorFlow与创建工程是在Minif ...
- Redis能保证数据不丢失吗?
大家即使没用过Redis,也应该都听说过Redis的威名. Redis是一种Nosql类型的数据存储,全称Remote Dictionary Server,也就是远程字典服务器,用过Dictionar ...
- 【Android逆向】破解看雪9月算法破解第一题
1. 安装apk到手机 2. 随意输入账号和密码,点击register,报错crackme1:ERROR 3. 将apk拖入到jadx中进行观察 public native String regist ...
- 构建SatelliteRpc:基于Kestrel的RPC框架(整体设计篇)
背景 之前在.NET 性能优化群内交流时,我们发现很多朋友对于高性能网络框架有需求,需要创建自己的消息服务器.游戏服务器或者物联网网关.但是大多数小伙伴只知道 DotNetty,虽然 DotNetty ...
- 【LeetCode二叉树#15】二叉搜索树的最小绝对差(巩固迭代中序遍历#2)
二叉搜索树的最小绝对差(迭代法中序遍历巩固) 力扣题目链接(opens new window) 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值. 示例: 提示:树中至 ...
- 第一百零四篇:DOM事件流
好家伙,JS基础接着学, 1.事件流 页面哪个部分拥有特定的事件? 可以把页面想象成一个同心圆, 当你戳了其中的一点,其实你同时戳中了很多个圆 当你点击一个页面中的按钮,实际上你同时点击了这个 ...
- 【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:
问题描述 在使用Python代码接受EventHub的消息时,根据文档要求安装azure-eventhub-checkpointstoreblob-aio模块时,出现了如下错误: ERROR: Cou ...
- RocketMQ(2) 消息的生产和存储
## 一 : 消息的生产 1. 消息的生产过程 Producer在发送消息时可以将消息写入到指定topic的某Broker中的某Queue中,其经历了如下过程: Producer发送消息之前,会先向N ...