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 流系统在复杂的分布式环境中能够可靠、高效地处理消息投递。

评论
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值