Orleans 流系统握手机制流程图

主流程图

复制代码
开始
  ↓
检查是否有队列缓存
  ↓ (有缓存)
询问消费者序列令牌
  ↓
消费者返回令牌?
  ↓ (是)
根据令牌创建游标
  ↓
游标.MoveNext() (移动到下一个消息)
  ↓
保存 LastToken
  ↓
握手成功
  ↓
开始消息投递
  ↓
结束

  ↓ (否)
使用缓存令牌创建游标
  ↓
保存 LastToken = null
  ↓
握手成功
  ↓
开始消息投递
  ↓
结束

异常处理流程图

复制代码
询问消费者令牌时发生异常
  ↓
检查代理是否正在关闭
  ↓ (是)
返回 false (停止处理)
  ↓
结束

  ↓ (否)
调用错误协议处理异常
  ↓
订阅被标记为故障?
  ↓ (是)
返回 false (停止处理该消费者)
  ↓
结束

  ↓ (否)
尝试使用缓存令牌创建游标
  ↓
成功?
  ↓ (是)
握手完成
  ↓
结束

  ↓ (否)
使用 null 令牌创建游标 (从头开始)
  ↓
握手完成
  ↓
结束

重试机制流程图

复制代码
开始重试
  ↓
调用消费者.GetSequenceToken()
  ↓
成功?
  ↓ (是)
返回结果
  ↓
结束

  ↓ (否)
检查重试条件
  ↓
满足重试条件?
  ↓ (是)
等待退避时间
  ↓
重试次数 < 最大重试次数?
  ↓ (是)
重试
  ↓
回到"调用消费者.GetSequenceToken()"

  ↓ (否)
抛出异常
  ↓
结束

  ↓ (否)
抛出异常
  ↓
结束

消息投递流程图

复制代码
握手完成
  ↓
获取当前消息
  ↓
投递给消费者
  ↓
消费者处理成功?
  ↓ (是)
移动到下一个消息
  ↓
还有更多消息?
  ↓ (是)
继续投递
  ↓
回到"获取当前消息"

  ↓ (否)
等待新消息或定期握手
  ↓
结束

  ↓ (否)
处理消费者错误
  ↓
标记订阅为故障?
  ↓ (是)
停止投递
  ↓
结束

  ↓ (否)
重试投递
  ↓
回到"投递给消费者"

关键决策点说明

1. 为什么需要 MoveNext()?

复制代码
消费者说:"我处理到消息 #100"
  ↓
代理理解:"消息 #100 已经处理过了"
  ↓
游标指向消息 #100
  ↓
MoveNext() 移动到消息 #101
  ↓
从消息 #101 开始投递

2. 重试条件判断

复制代码
发生异常
  ↓
是 ClientNotAvailableException?
  ↓ (是)
不重试 (客户端不可用,重试无意义)
  ↓
结束

  ↓ (否)
代理正在关闭?
  ↓ (是)
不重试 (系统正在关闭)
  ↓
结束

  ↓ (否)
重试 (网络问题等临时性错误)
  ↓
继续

3. 备用方案选择

复制代码
握手失败
  ↓
尝试使用缓存令牌
  ↓
成功?
  ↓ (是)
使用缓存位置
  ↓
结束

  ↓ (否)
使用 null 令牌 (从头开始)
  ↓
结束

设计优势总结

  1. 可靠性:多重容错机制确保消息不丢失
  2. 一致性:通过令牌机制保证消息顺序
  3. 性能:按需投递,避免重复处理
  4. 可扩展性:支持多消费者、多流并发
  5. 可观测性:完善的日志和监控

这个握手机制是 Orleans 流系统可靠性的核心保障,通过精心设计的流程和异常处理,确保了分布式环境下的消息可靠投递。

相关推荐
秋94 天前
AI快速生成可编辑的流程图的方法
流程图
宁静致远20214 天前
Mermaid VSCode插件制作流程图保存方法
ide·vscode·流程图
min1811234566 天前
小型网站开发简易流程步骤 在线画图工具快速生成开发流程图方法
论文阅读·信息可视化·毕业设计·流程图·论文笔记
DYuW5gBmH7 天前
Kafka 成功消费消息的完整流程图
分布式·kafka·流程图
数说星榆1819 天前
无人员伤亡车辆事故处理流程图 快速结案流程
架构·电脑·流程图·职场发展·课程设计
dajun1811234569 天前
信息系统运维管理全流程详解 在线画图工具绘制运维流程图表技巧
运维·数据库·信息可视化·流程图·旅游·论文笔记
数说星榆1819 天前
罕见病例报告流程图学术论文用
论文阅读·人工智能·流程图
fish-man10 天前
测试流程图显示
流程图
橙色日落10 天前
Vue2 + LogicFlow 实现可视化流程图编辑功能+常用属性大全
前端·vue·流程图·logicflow
数说星榆18111 天前
油气勘探数据可视化流程图制作
论文阅读·信息可视化·毕业设计·流程图·论文笔记·毕设