首页/新闻资讯/正文详情

Orleans JournaledGrain 状态变更通知:OnStateChanged 与 OnTentativeStateChanged 完整指南

发布时间:2026/9/24 14:44:31 来源:云帆数科 栏目:资讯中心
Orleans JournaledGrain 状态变更通知:OnStateChanged 与 OnTentativeStateChanged 完整指南
后端微服务【免费下载链接】orleansCloud Native application framework for .NET项目地址https://gitcode.com/gh_mirrors/or/orleans点击查看免费下载JournaledGrain日志一致性 Grain是 Orleans 事件溯源Event Sourcing体系的核心抽象。当确认视图confirmed view或暂定视图tentative view发生变化时Orleans 会通过两个受保护回调把变化通知给开发者OnStateChanged与OnTentativeStateChanged。本文以仓库文档 notifications.md 为主体结合 JournaledGrain.cs 与 PrimaryBasedLogViewAdaptor.cs 的源码实现讲解这两个回调的触发时机、源码级调用链、使用边界与编写注意事项。读完本文你将能正确地在事件溯源 Grain 中监听状态变化并规避把回调误当作恰好一次集成事件的常见陷阱。两个回调的分工确认视图与暂定视图JournaledGrainTGrainState, TEventBase内部维护两种视图对应两组属性详见 journaledgrain-basics.md确认视图State仅包含已确认confirmed的事件Version等于已确认事件总数暂定视图TentativeState在确认视图基础上叠加了本地已提交但尚未确认的事件UnconfirmedEvents返回当前未确认后缀。两个回调分别对应这两类视图的变化。文档给出的标准覆写方式如下完整代码见 EventSourcingSnippets.csprotected override void OnStateChanged() { // Inspect State and Version. } protected override void OnTentativeStateChanged() { // Inspect TentativeState and UnconfirmedEvents. }注意JournaledGrain的这两个回调默认实现为空见 JournaledGrain.cs你只覆写关心的那个即可它们都是protected virtual只能由派生 Grain 内部调用外部调用者无法直接触发。OnStateChanged确认版本可能已增加文档明确指出覆写OnStateChanged用于在确认版本可能已经增加之后做出反应。它属于通知型回调不是精确到每次变更都恰好调用一次的强保证。三个典型触发时机从源码调用链看OnStateChanged在以下场景被触发激活时加载了更新的状态。JournaledGrain.OnActivateAsync默认调用LogViewAdaptor.Synchronize()等待从存储加载最新视图见 JournaledGrain.cs加载完成后若确认视图前进便会触发回调本地事件被确认。RaiseEvent/RaiseEvents提交的事件经日志一致性适配器写入主存储后确认版本前进并触发回调见下文源码路径收到协议通知。集群中其他副本写入新事件后会向本副本发送版本通知消息触发一次强制刷新needRefresh从而更新确认视图见 PrimaryBasedLogViewAdaptor.cs 与ProcessNotifications逻辑。重要边界它不是恰好一次的集成事件回调这是本文最需要强调的约束OnStateChanged不是 exactly-once 的集成事件回调。它可能因激活重放、后台确认、协议同步等原因被多次调用调用次数与业务上发生了多少次事件没有一一对应关系。因此不要在这里执行外部副作用发邮件、调第三方 API、写其他系统等除非你的应用自带幂等机制或 outbox发件箱协议。若确实需要可靠的集成语义应当基于事件日志本身设计例如在自定义存储或日志存储之上结合RetrieveConfirmedEvents消费已确认事件段并配合幂等键或 outbox 模式落库。OnTentativeStateChanged暂定视图变化通知OnTentativeStateChanged在暂定视图发生变化时被调用。触发源同样是源码中明确可查的RaiseEvent会立即触发它。JournaledGrain.RaiseEventTEvent内部调用LogViewAdaptor.Submit(event)见 JournaledGrain.csSubmit在把事件放入 pending 队列后立刻调用Host.OnViewChanged(true, false)见 PrimaryBasedLogViewAdaptor.cs其中true表示暂定视图已变化。也就是说只要调用了RaiseEventOnTentativeStateChanged就会在同一回合内被调用确认或同步改变了暂定后缀。当批量写主存储成功、事件从 pending 队列移除时暂定视图随之变化OnViewChanged(false, true)见 PrimaryBasedLogViewAdaptor.cs条件事件失败conflict导致暂定后缀被裁剪。RemoveStaleConditionalUpdates在条件事件因版本冲突失败而移除时也会通知暂定视图变化见 PrimaryBasedLogViewAdaptor.cs清空日志ClearLogAsync后视图被重置同时通知暂定与确认变化见 PrimaryBasedLogViewAdaptor.cs。在OnTentativeStateChanged内你可以检查TentativeState确认 未确认事件叠加后的视图与UnconfirmedEvents未确认后缀用于实现乐观 UI 更新、校验提示等场景。源码级调用链OnViewChanged 如何分发两个回调两个回调的枢纽是ILogViewAdaptorHostTLogView, TLogEntry.OnViewChanged(bool tentative, bool confirmed)JournaledGrain的实现把两个布尔标志直接映射到两个回调void ILogViewAdaptorHostTGrainState, TEventBase.OnViewChanged(bool tentative, bool confirmed) { if (tentative) OnTentativeStateChanged(); if (confirmed) OnStateChanged(); }见 JournaledGrain.cs适配器侧PrimaryBasedLogViewAdaptor在以下位置调用该方法构成完整触发矩阵调用点标志触发场景SubmitInternalSubmit/SubmitRange/TryAppend(true, false)每次提交事件暂定视图立即变化UpdatePrimary批量写成功后(false, true)事件确认确认视图前进NotifyViewChanges读主存储后比较版本按版本差异从存储刷新/收到版本通知后RemoveStaleConditionalUpdates(true, false)条件事件冲突被裁剪ProcessClearLogRequest(true, true)清空日志重置状态值得注意的实现细节暂定视图TentativeState是惰性计算的深拷贝——CalculateTentativeState用Services.DeepCopy复制确认视图后依次重放 pending 事件见 PrimaryBasedLogViewAdaptor.cs因此读取它是安全的且每次回调前后状态对象都是独立的副本。这也提醒我们回调中观察到的是某一时刻的视图快照而非稳定不变的引用。编写回调的硬性约束文档对两个回调提出了一致的编写要求这些要求与 Orleans 的调度模型直接相关在 Orleans 回合式调度turn-based scheduling下执行。回调在 Grain 的调度回合内运行与 Grain 方法共享同一个回合语义可重入reentrant不会让两个回合在不同线程上并行但回合之间存在交错可能回调必须快速返回。OnViewChanged是被日志一致性适配器在 worker 循环中同步调用的见 ILogViewAdaptorHost.cs其中任何耗时操作都会阻塞适配器的后台工作循环进而拖慢确认与同步进度不要假设观察到的状态在后续await之后保持不变。因为回调执行期间可能让出调度其他回合如新的RaiseEvent、协议同步可能已经推进或回退了视图。如果需要跨await使用某个值请先把它捕获到局部变量需要最新状态就重新读取State/TentativeState。这一点与 immediate-vs-delayed-confirmation.md 中状态可跨 await 变化的提醒一脉相承回调里不要直接修改State/TentativeState。状态变更只能通过提交事件驱动RaiseEvent、RaiseEvents、RaiseConditionalEvent等否则会破坏日志一致性协议对视图的掌控。回调与相关 API 的配合使用在实际项目中这两个回调通常与以下 API 协同ConfirmEvents()等待此前提交的所有事件被确认保证强一致线性化读取。确认完成后确认视图前进OnStateChanged会被触发RefreshNow()强制同步最新全局状态并确认已提交事件等价于LogViewAdaptor.Synchronize()。激活时加载新状态、收到远端版本通知后的刷新都走这条路径RaiseConditionalEvent/RaiseConditionalEvents条件提交冲突时返回false。冲突裁剪会触发OnTentativeStateChanged便于你借此刷新 UI 或提示重试RetrieveConfirmedEvents(fromVersion, toVersion)按版本段读取已确认事件。若你需要恰好一次的集成语义推荐基于该 API 自行构建消费游标 幂等/outbox而不是依赖OnStateChangedOnConnectionIssue/OnConnectionIssueResolved连接健康回调用于监控底层存储/复制协议故障见 journaledgrain-diagnostics.md与状态通知回调正交可配合使用。小结OnStateChanged在确认视图可能前进时触发激活加载、本地事件确认、协议通知用于反应已落盘的确定性状态它不是 exactly-once 集成事件回调外部副作用需自行保证幂等或使用 outboxOnTentativeStateChanged在暂定视图变化时触发RaiseEvent立即触发、确认/同步/条件冲突改变暂定后缀用于反应已提交但未确认的乐观视图两者都由ILogViewAdaptorHost.OnViewChanged分发见 JournaledGrain.cs在回合式调度下执行必须快速、无副作用假设、且不直接改写状态。更完整的背景可继续阅读同目录文档event-sourcing 索引、JournaledGrain API 基础、立即确认与延迟确认、日志一致性提供程序 与 多副本实例。赞分享后端微服务【免费下载链接】orleansCloud Native application framework for .NET项目地址https://gitcode.com/gh_mirrors/or/orleans点击查看免费下载相关推荐10 秒把自己变成AI数字人Duix.Avatar本地部署新手完整指南10 秒把自己变成AI数字人Duix.Avatar本地部署新手完整指南 Duix.Avatar 是一款真正开源的 AI 数字人克隆工具只需提交一段 10 秒人工智能AI 应用数字人媒体生成桌面应用LibreHardwareMonitor免费开源的硬件监控工具LibreHardwareMonitor免费开源的硬件监控工具 LibreHardwareMonitor 是一款免费开源的硬件监控工具能实时读取电脑的温度传指标监控如何实现Kazumi插件更新通知桌面通知与状态栏提示完整指南如何实现Kazumi插件更新通知桌面通知与状态栏提示完整指南 Kazumi是一款基于自定义规则的番剧采集APP支持流媒体在线观看和弹幕功能。对于插件驱动型应移动开发桌面应用音视频上一篇Google Java Format作为库使用的终极指南10个简单步骤快速集成下一篇Apache Pinot数据格式支持完全指南Avro、Parquet、JSON等7大格式深度对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

PinchTab 结果验证与陷阱排查指南:从“事件已触发“到“状态已确认“的可靠浏览器自动化
PinchTab 结果验证与陷阱排查指南:从“事件已触发“到“状态已确认“的可靠浏览器自动化

PinchTab 结果验证与陷阱排查指南:从"事件已触发"到"状态已确认"的可靠浏览器自动化 【免费下载链接】pinchtab High-performance browser automation bridge and multi-instance orchestrator with advanced stealth injection and real-time … · 2026/9/24 14:44:31

Eclipse Mosquitto 2.0.22 发布详解:Broker、客户端库与动态安全插件的关键修复
Eclipse Mosquitto 2.0.22 发布详解:Broker、客户端库与动态安全插件的关键修复

后端消息队列消息路由 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mos/mosquitto 点击查看 免费下载 Eclipse Mosquitto 于 2025 年 7 月发布 2.0.22 版本,这是一次聚焦稳定… · 2026/9/24 14:44:24

PHP 实现 mal(Make a Lisp):Web 托管运行、PHP 互操作与源码剖析
PHP 实现 mal(Make a Lisp):Web 托管运行、PHP 互操作与源码剖析

示例工程 【免费下载链接】mal mal - Make a Lisp 项目地址: https://gitcode.com/gh_mirrors/ma/mal 点击查看 免费下载 本篇技术指南围绕 impls/php/README.md 展开,讲解如何把用 PHP 编写的 mal(Make a Lisp)解释器直接跑在普… · 2026/9/24 14:44:24

热门题目分类+清单
热门题目分类+清单

题单来源:https://leetcode.cn/studyplan/top-100-liked/ 类别题目解题思路哈希表1.两数之和(简单)49.字母异位词分组(中等)128.最长连续序列(中等)①以每个item为开端且item-1不在set里面&… · 2026/9/24 16:32:22

设计之美:circleImageView4cj 圆形图片裁剪指南——CircleImageModel 链式调用与构建者模式完整剖析
设计之美:circleImageView4cj 圆形图片裁剪指南——CircleImageModel 链式调用与构建者模式完整剖析

设计之美:circleImageView4cj 圆形图片裁剪指南——CircleImageModel 链式调用与构建者模式完整剖析 【免费下载链接】circle-image-view-cj 自定义圆形imageview,主要实现圆形图片展示 项目地址: https://gitcode.com/Cangjie-TPC/circle-image-view-… · 2026/9/24 16:32:22

PaddleSpeech T2S 训练框架 IntervalTrigger 源码解析:按迭代(iteration)与轮次(epoch)周期触发扩展的调度机制
PaddleSpeech T2S 训练框架 IntervalTrigger 源码解析:按迭代(iteration)与轮次(epoch)周期触发扩展的调度机制

人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword… · 2026/9/24 16:32:22

免费开源:用tchMaterial-parser下载国家中小学智慧教育平台电子课本PDF,新手完整指南
免费开源:用tchMaterial-parser下载国家中小学智慧教育平台电子课本PDF,新手完整指南

免费开源:用tchMaterial-parser下载国家中小学智慧教育平台电子课本PDF,新手完整指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff… · 2026/9/24 16:32:15

wp-calypso 促销区块组件(Promo Section)完全指南:布局、属性与实战用例
wp-calypso 促销区块组件(Promo Section)完全指南:布局、属性与实战用例

前端CMS 【免费下载链接】wp-calypso The JavaScript and API powered WordPress.com 项目地址: https://gitcode.com/gh_mirrors/wp/wp-calypso 点击查看 免费下载 Promo Section 是 wp-calypso 中用于排版 PromoCard 组件、构建推广型页面布局的容器组件&#xf… · 2026/9/24 16:32:15

使用 lego 通过百度云(Baidu Cloud)DNS 完成 ACME DNS-01 挑战:配置指南与源码实现解析
使用 lego 通过百度云(Baidu Cloud)DNS 完成 ACME DNS-01 挑战:配置指南与源码实现解析

网络安全密码学 【免费下载链接】lego Lets Encrypt/ACME client and library written in Go 项目地址: https://gitcode.com/gh_mirrors/le/lego 点击查看 免费下载 导读 本文以 lego 官方文档中 Baidu Cloud DNS 提供者页面(docs/content/dns/zz_gen… · 2026/9/24 16:32:15

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码