Orleans流系统时序图

Orleans流系统完整时序图

时序图概述

这个时序图展示了Orleans流系统中从生产者发送消息到消费者接收消息的完整流程,包括订阅管理、消息持久化、PubSub系统和消息投递等关键环节。

时序图

生产者GrainStreamImpl<T>PersistentStreamProducer队列适配器消息队列PersistentStreamPullingAgentPubSubRendezvousGrainStreamConsumerExtension消费者Grain阶段1: 消费者订阅SubscribeAsync()生成subscriptionId(GUID)RegisterConsumer(subscriptionId, streamId, consumerGrainId, filterData)存储消费者订阅状态AddSubscriber(subscriptionId, streamId, consumerGrainId, filterData)创建StreamConsumerData并缓存DoHandshakeWithConsumer()GetSequenceToken()返回序列令牌创建消息游标CursorRunConsumerCursor()开始投递阶段2: 生产者注册OnNextAsync(message)OnNextAsync(message)RegisterProducer(streamId, producerGrainId)存储生产者状态返回现有消费者列表QueueMessageAsync(message)持久化消息到队列阶段3: 消息拉取和投递GetQueueMessagesAsync()返回消息批次AddToCache()缓存消息遍历所有消费者DeliverItem(subscriptionId, message)查找对应的观察者OnNextAsync(message, token)处理消息逻辑Task完成(背压控制)投递完成loop[为每个消费者投递消息]阶段4: 背压控制OnNextAsync(nextMessage)OnNextAsync(nextMessage)QueueMessageAsync(nextMessage)长时间处理消息Task未完成暂停拉取新消息队列满,等待Task等待完成阻塞等待消费者Task快速完成继续拉取新消息消息成功入队Task立即完成立即返回alt[消费者处理慢(背压生效)][消费者处理正常]阶段5: 取消订阅UnsubscribeAsync(handle)UnregisterConsumer(subscriptionId, streamId)移除消费者订阅状态RemoveSubscriber(subscriptionId, streamId)移除StreamConsumerDataRemoveObserver(subscriptionId)生产者GrainStreamImpl<T>PersistentStreamProducer队列适配器消息队列PersistentStreamPullingAgentPubSubRendezvousGrainStreamConsumerExtension消费者Grain

关键组件说明

1. 生产者端组件

  • Producer Grain: 业务逻辑生产者
  • StreamImpl: 流接口实现,提供OnNextAsync等API
  • PersistentStreamProducer: 持久化流生产者,处理消息发送

2. 消息队列组件

  • QueueAdapter: 队列适配器,抽象不同消息队列实现
  • Message Queue: 实际的消息队列(如Azure Service Bus、RabbitMQ等)

3. 消费者端组件

  • PersistentStreamPullingAgent: 消息拉取代理,负责从队列拉取消息
  • StreamConsumerExtension: 消费者扩展,管理本地订阅和消息投递
  • Consumer Grain: 业务逻辑消费者

4. PubSub系统

  • PubSubRendezvousGrain: 发布-订阅汇聚点Grain,管理订阅关系

核心流程说明

订阅流程 (阶段1)

  1. 消费者调用SubscribeAsync()订阅流
  2. 生成唯一的subscriptionId
  3. 在PubSub系统中注册消费者
  4. 拉取代理创建消费者数据并建立消息游标

生产者注册 (阶段2)

  1. 生产者发送消息时自动注册到PubSub
  2. 消息通过队列适配器持久化到消息队列

消息投递 (阶段3)

  1. 拉取代理从队列拉取消息并缓存
  2. 为每个活跃消费者投递消息
  3. 调用消费者Grain的OnNextAsync方法

背压控制 (阶段4)

  1. 通过Task完成机制实现自然背压
  2. 消费者处理慢时,生产者会被阻塞等待
  3. 确保系统不会因消息积压而崩溃

取消订阅 (阶段5)

  1. 消费者调用UnsubscribeAsync()取消订阅
  2. 清理PubSub系统中的订阅状态
  3. 停止向该消费者投递消息

设计优势

  1. 完全解耦: 生产者和消费者互不知晓对方存在
  2. 可靠性: 消息持久化确保不丢失
  3. 可扩展性: 支持动态添加/移除消费者
  4. 背压控制: 自然的消息流控制机制
  5. 分布式友好: 基于虚拟Actor模型,位置透明
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helloworddm

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值