当前位置: 首页 > news >正文

Orleans 流系统握手机制时序图

时序图说明

以下时序图展示了 Orleans 流系统中握手机制的完整流程,包括正常情况和异常情况的处理。

1. 正常握手流程

流代理(PullingAgent)消费者(Consumer)缓存(QueueCache)存储(Storage)GetSequenceToken(subscriptionId)查询上次处理位置返回 lastProcessedToken返回 StreamHandshakeTokenGetCacheCursor(streamId, token)返回 CursorCursor.MoveNext() (移动到下一个未处理消息)保存 LastToken = requestedHandshakeToken握手成功,开始消息投递流代理(PullingAgent)消费者(Consumer)缓存(QueueCache)存储(Storage)

2. 新订阅握手流程

流代理(PullingAgent)新消费者(NewConsumer)缓存(QueueCache)GetSequenceToken(subscriptionId)返回 null (新订阅,无历史状态)GetCacheCursor(streamId, cacheToken)返回 Cursor (从缓存位置开始)保存 LastToken = null握手成功,从缓存位置开始投递流代理(PullingAgent)新消费者(NewConsumer)缓存(QueueCache)

3. 异常处理流程

流代理(PullingAgent)消费者(Consumer)错误协议(ErrorProtocol)GetSequenceToken(subscriptionId)抛出异常 (网络问题/消费者不可用)检查 IsShutdownreturn false (停止处理)ErrorProtocol(consumerData, exception)记录错误,决定是否标记为故障返回 faultedSubscription 状态return false (停止处理该消费者)GetCacheCursor(streamId, cacheToken) (备用方案)握手完成,使用备用位置alt[订阅被标记为故障][订阅正常]alt[代理正在关闭][代理正常运行]流代理(PullingAgent)消费者(Consumer)错误协议(ErrorProtocol)

4. 重试机制流程

流代理(PullingAgent)消费者(Consumer)重试执行器(RetryExecutor)ExecuteWithRetries(GetSequenceToken, INFINITE_RETRIES)GetSequenceToken(subscriptionId)返回 StreamHandshakeToken返回结果抛出异常检查重试条件等待退避时间GetSequenceToken(subscriptionId) (重试)抛出异常alt[满足重试条件][不满足重试条件]alt[成功][失败]流代理(PullingAgent)消费者(Consumer)重试执行器(RetryExecutor)

5. 消息投递流程

流代理(PullingAgent)消费者(Consumer)缓存(QueueCache)Cursor.GetCurrent() (获取当前消息)返回 StreamMessageDeliverMessage(message, sequenceToken)处理消息返回处理结果Cursor.MoveNext() (移动到下一个消息)返回是否还有更多消息继续投递下一条消息等待新消息或定期握手alt[还有更多消息][没有更多消息]流代理(PullingAgent)消费者(Consumer)缓存(QueueCache)

6. 故障恢复流程

流代理(PullingAgent)重启消费者(RestartedConsumer)存储(Storage)恢复上次处理状态返回 lastProcessedTokenGetSequenceToken(subscriptionId)返回恢复的 StreamHandshakeTokenGetCacheCursor(streamId, recoveredToken)Cursor.MoveNext() (从恢复位置的下一个开始)保存恢复状态握手成功,从恢复位置继续投递流代理(PullingAgent)重启消费者(RestartedConsumer)存储(Storage)

7. 状态同步流程

流代理(PullingAgent)消费者(Consumer)存储(Storage)处理消息完成更新 lastProcessedToken确认状态已保存定期握手检查GetSequenceToken(subscriptionId)返回当前状态比较当前状态与 LastToken继续正常投递调整投递位置从新位置开始投递alt[状态一致][状态不一致]流代理(PullingAgent)消费者(Consumer)存储(Storage)

8. 关键设计决策说明

8.1 为什么使用无限重试?

  • 可靠性优先:握手失败意味着消息投递失败
  • 网络不稳定:分布式环境中网络问题很常见
  • 消费者重启:消费者可能暂时不可用

8.2 为什么需要 MoveNext()?

  • 避免重复:令牌指向已处理的消息
  • 连续性保证:确保从下一个未处理消息开始
  • 状态一致性:保持消费者和代理状态同步

8.3 为什么需要备用方案?

  • 容错性:握手失败时系统仍能工作
  • 降级策略:从已知安全位置开始
  • 系统可用性:避免因握手失败导致整个系统停止

8.4 为什么保存 LastToken?

  • 下次握手参考:为下次握手提供基准
  • 状态追踪:监控消费者状态变化
  • 性能优化:减少重复的状态查询

9. 性能优化点

  1. 异步处理:所有操作都是异步的,避免阻塞
  2. 状态缓存:缓存常用状态信息,减少存储访问
  3. 批量操作:支持批量消息投递
  4. 智能重试:使用退避算法避免过度重试
  5. 资源管理:及时释放不需要的资源

10. 监控指标

  • 握手成功率:成功握手次数 / 总握手次数
  • 握手延迟:从开始握手到完成的时间
  • 重试次数:平均重试次数
  • 错误率:握手失败的比例
  • 消息投递延迟:从握手完成到开始投递的时间

这个握手机制确保了 Orleans 流系统在复杂的分布式环境中能够可靠、高效地处理消息投递。

http://www.dtcms.com/a/498878.html

相关文章:

  • 【C + +】异常处理:深度解析与实战
  • 《从理论到实践:红黑树的自平衡机制与C++高效实现指南》
  • 将iOS/macOS应用上架至App Store
  • 海南做网站电话如今做哪个网站能致富
  • 数据结构——栈在递归中的应用
  • java.net 包详解
  • Three.js光照技术详解:为3D场景注入灵魂
  • 企业门户网站系统下载网店平台
  • 监听指定事件然后触发鼠标点击操作等,智能文本识别按键工具的使用教程
  • connect 的断线重连
  • wp-config.php文件是什么
  • 编译esp-idf小智报错
  • 微信小程序开发踩坑记:从AI工具翻车到找到合适方案
  • 《3D植被建模痛点解决:开放世界层级实例化+GPU批处理优化方案》
  • openharmony之分布式蓝牙实现多功能场景设备协同实战
  • Linux ARM 程序启动全链路解析:从 shell 到 main(含动态/静态链接)
  • 具身智能黑客松之旅002
  • 免费发布产品网站网站权重能带来什么作用
  • 碰一碰发视频 系统源码 /PHP 语言开发方案
  • 网站大学报名官网入口网站插件代码下载
  • Cors能干什么?为什么需要它?
  • 远程办公自由:rdesktop+cpolar让Windows桌面随身而行
  • 计算机网络(tcp_socket )
  • 【小白笔记】在编程中,如何将概念上的数据结构(比如“树”)转化为代码中具体的数据类型和对象
  • 【STM32项目开源】STM32单片机智能农业大棚控制系统
  • github开源笔记应用程序项目推荐-Joplin
  • 【Swift】LeetCode 438. 找到字符串中所有字母异位词
  • 【SoC】【W800】基于WM IoT SDK的环境搭建
  • BFS 与 DFS——力扣102.二叉树的层序遍历
  • 使用IOT-Tree的OPC UA Client连接器对接OPC UA Server获取数据到系统中