Orleans ADO.NET 提供程序配置指南:为集群、持久化、提醒与流式传输接入关系型数据库
后端微服务【免费下载链接】orleansCloud Native application framework for .NET项目地址https://gitcode.com/gh_mirrors/or/orleans点击查看免费下载本文是 Orleans 官方配置文档configuring-ado-dot-net-providers.md的深度实践版系统讲解如何用 ADO.NET 提供程序让 Orleans 的集群成员管理Clustering、Grain 持久化Grain Storage、提醒Reminders、Grain 目录Grain Directory与流式传输Streaming共用一套关系型数据库。读完本文你将掌握各能力对应的 NuGet 包与配置位置、数据库脚本的安装顺序与定制原则、SQL Server / PostgreSQL / MySQL / MariaDB / Oracle 的完整配置方法、基于DbDataSource的高级连接源注入方式以及声明式配置与生产运维要点。ADO.NET 提供程序与运行时能力总览Orleans 的 ADO.NET 提供程序使用一个关系型数据库承载一种或多种运行时能力。每种能力对应独立的 NuGet 包并可在不同端Silo 或外部客户端上配置能力包配置位置集群ClusteringMicrosoft.Orleans.Clustering.AdoNetSilo 与外部客户端Grain 存储Grain storageMicrosoft.Orleans.Persistence.AdoNetSilo提醒RemindersMicrosoft.Orleans.Reminders.AdoNetSiloGrain 目录Grain directoryMicrosoft.Orleans.GrainDirectory.AdoNetSilo流式传输StreamingMicrosoft.Orleans.Streaming.AdoNetSilo 与外部客户端安装原则只安装应用实际用到的能力包同时引用对应的数据库驱动包driver package。例如只做集群 持久化就只安装 Clustering 与 Persistence 两个包并额外引用Microsoft.Data.SqlClient等驱动。从源码看这些包之间的依赖是解耦的集群能力通过 AdoNetHostingExtensions.cs 向 DI 容器注册IMembershipTableSilo 侧或IGatewayListProvider客户端侧实现Grain 存储通过 AdoNetGrainStorageSiloBuilderExtensions.cs 提供AddAdoNetGrainStorage/AddAdoNetGrainStorageAsDefault提醒服务通过 SiloBuilderReminderExtensions.cs 提供UseAdoNetReminderService。各能力按需注册互不强制。准备数据库先运行主脚本再运行能力脚本每个提供程序目录旁都存放着对应的 SQL 脚本。正确的安装顺序是先运行主脚本Main建立基础表与查询注册表再运行该能力自己的脚本。以 SQL Server 上同时启用集群与持久化为例依次执行src/AdoNet/Shared/SQLServer-Main.sqlsrc/AdoNet/Orleans.Clustering.AdoNet/SQLServer-Clustering.sqlsrc/AdoNet/Orleans.Persistence.AdoNet/SQLServer-Persistence.sql其他数据库与能力的脚本对应关系如下完整清单见 adonet-configuration.md脚本类型SQL ServerPostgreSQLMySQL/MariaDBOracleSQLite主脚本SQLServer-Main.sqlPostgreSQL-Main.sqlMySQL-Main.sqlOracle-Main.sqlSqlite-Main.sql集群SQLServer-Clustering.sqlPostgreSQL-Clustering.sqlMySQL-Clustering.sqlOracle-Clustering.sql—持久化SQLServer-Persistence.sqlPostgreSQL-Persistence.sqlMySQL-Persistence.sqlOracle-Persistence.sqlSqlite-Persistence.sql提醒SQLServer-Reminders.sqlPostgreSQL-Reminders.sqlMySQL-Reminders.sqlOracle-Reminders.sql—Grain 目录SQLServer-GrainDirectory.sqlPostgreSQL-GrainDirectory.sqlMySQL-GrainDirectory.sql——流式传输SQLServer-Streaming.sqlPostgreSQL-Streaming.sqlMySQL-Streaming.sql——并非每种能力都支持每种数据库provider 目录中是否存在对应脚本是判断该 Orleans 版本是否支持某数据库的权威依据。例如 Grain 目录与流式传输目前没有 Oracle 脚本SQLite 仅覆盖本地持久化场景Sqlite-Main.sql与Sqlite-Persistence.sql。配置前务必核实所选能力在目标数据库上有对应脚本。[!IMPORTANT] 应使用与应用部署的 Orleans 包同一版本发布的脚本。OrleansQuery脚本与查询的契约机制主脚本不只是建表。以 SQLServer-Main.sql 为例它会创建一个OrleansQuery表QueryKeyQueryText两列用于注册 Orleans 运行时会用到的全部 SQL 语句各能力脚本随后通过INSERT INTO OrleansQuery写入自己的查询定义。主脚本头部注释明确了这一契约Orleans按列名和类型读取结果按参数名和类型写入因此脚本必须保留输入/输出的名称与类型允许针对具体厂商做部署级调优只要不破坏接口契约各厂商脚本应尽量保留一致的约束名便于排查问题ETag 是不透明的版本列实现类型不限SQL Server 脚本用整数实现返回 TRUE/FALSE 的查询按“0 为真、0 为假”解释异常会触发 Orleans 重试。例如 SQLServer-Clustering.sql 创建OrleansMembershipVersionTable以DeploymentId为主键、维护Version与OrleansMembershipTable记录每个 Silo 的地址、端口、代数、状态、心跳时间等并把UpdateIAmAlivetimeKey、InsertMembershipVersionKey等查询写入OrleansQuery。运行期 provider 只通过OrleansQuery中的语句访问数据库。生产库布局与 Schema 定制脚本创建的是未限定名称unqualified的表落在数据库用户的默认 schema 下provider 查询也以未限定名引用这些对象。Orleans 没有提供选择 schema 或 filegroup 的配置项。如果生产库需要专用 schema、filegroup、分区或其他存储布局必须把定制放进数据库部署流程中自行实现并保持以下要素与 Orleans 兼容表名、列名、参数名OrleansQuery中存储的查询及其返回结果形状result shape。脚本只是起点 schema不是放之四海皆准的生产布局。定制后的脚本与查询应在应用启动路径之外完成应用与验证例如先用预发布集群验证不要把“让 Silo 在运行时自行建表”当作常规手段也不要给 Silo 授予 schema-owner 级别的权限。schema 变更应作为受控的部署步骤执行。配置 SQL ServerSQL Server 使用Microsoft.Data.SqlClient驱动与Microsoft.Data.SqlClientinvariant。以下示例来自官方示例片段 HostingExamples.csadonet_silo与adonet_client两段在同一 Silo 上同时启用集群、提醒与 Grain 存储var builder Host.CreateApplicationBuilder(args); var connectionString builder.Configuration.GetConnectionString(orleans) ?? throw new InvalidOperationException( Connection string orleans is required.); builder.UseOrleans(siloBuilder { siloBuilder.UseAdoNetClustering(options { options.Invariant Microsoft.Data.SqlClient; options.ConnectionString connectionString; }); siloBuilder.UseAdoNetReminderService(options { options.Invariant Microsoft.Data.SqlClient; options.ConnectionString connectionString; }); siloBuilder.AddAdoNetGrainStorageAsDefault(options { options.Invariant Microsoft.Data.SqlClient; options.ConnectionString connectionString; }); });外部客户端与 Silo 使用同一个集群数据库builder.UseOrleansClient(clientBuilder { clientBuilder.UseAdoNetClustering(options { options.Invariant Microsoft.Data.SqlClient; options.ConnectionString connectionString; }); });[!IMPORTANT]System.Data.SqlClient不是 SQL Server 的 Orleans invariant。必须引用Microsoft.Data.SqlClient包并使用Microsoft.Data.SqlClientinvariant。从源码看UseAdoNetClustering在 Silo 侧注册 AdoNetClusteringTable 作为IMembershipTable实现在客户端侧注册 AdoNetGatewayListProvider 作为IGatewayListProvider实现见 AdoNetHostingExtensions.cs。也就是说客户端只读网关列表不直接参与成员表写入。Invariant是必填项Orleans 用它选择数据库特有的查询与行为而不是仅靠连接字符串自动推断。各能力 Option 类如 AdoNetClusteringSiloOptions.cs都包含ConnectionString、DataSource与Invariant三个核心属性其中连接字符串与数据源属性带有[Redact]标记日志输出时会自动脱敏。配置其他数据库PostgreSQL、MySQL/MariaDB 与 OraclePostgreSQL、MySQL/MariaDB 与 Oracle 的 Orleans 配置形状与 SQL Server 完全一致只需同时替换三样东西驱动包、invariant、SQL 脚本。官方对应关系如下数据库驱动包Orleans invariantSQL ServerMicrosoft.Data.SqlClientMicrosoft.Data.SqlClientPostgreSQLNpgsqlNpgsqlMySQL/MariaDBMySql.DataMySql.Data.MySqlClientOracleOracle.ManagedDataAccess.CoreOracle.DataAccess.Client此外Orleans 还识别开源 MySQL 驱动MySqlConnectorinvariant 为MySql.Data.MySqlConnector。完整的 invariant 支持列表可以在源码 AdoNetInvariants.cs 中确认共六项Microsoft.Data.SqlClient、Npgsql、MySql.Data.MySqlClient、MySql.Data.MySqlConnector、Oracle.DataAccess.Client、System.Data.SQLite。invariant 并不仅是字符串标记。从 DbConstantsStore.cs 可以看到每个 invariant 都绑定了一组数据库常量标识符转义字符SQL Server 用[]、PostgreSQL 用、MySQL 用、是否原生支持命令取消、是否为同步 ADO.NET 实现MySQL 与 Oracle 标记为同步实现执行时会被包装到线程池任务中以及命令拦截器Oracle 使用专门的OracleCommandInterceptor用于改写 LIMIT 之类的语法差异。这正是“invariant 决定数据库特定查询与行为”的底层机制。配置 PostgreSQL 的示意builder.UseOrleans(siloBuilder { siloBuilder.UseAdoNetClustering(options { options.Invariant Npgsql; options.ConnectionString connectionString; }); });MySQL/MariaDB 只需把Invariant改为MySql.Data.MySqlClient、Oracle 改为Oracle.DataAccess.Client并分别选用对应的脚本。使用 DbDataSource 作为连接源每个 ADO.NET 提供程序的 Option 类型都接受连接字符串或DbDataSource二选一。DbDataSource适合连接字符串无法表达驱动级配置的场景例如需要定期刷新的认证令牌token。配置原则与行为约束恰好配置一个连接源。Orleans 会拒绝同时提供ConnectionString与DataSource、或两者都缺失的配置——这一点同时体现在配置验证器AdoNetGrainStorageOptionsValidator与运行时工厂 RelationalStorage.CreateInstance 中两者都会抛出“必须二选一”的异常即使使用数据源仍然必须设置Invariant因为 Orleans 要据此选择数据库特有的查询与行为将数据源注册为singleton并通过 provider 的OptionsBuilder配置重载解析命名 provider 可以解析不同的keyed 数据源keyed data source生命周期归属数据源由依赖注入容器或应用拥有并负责保持存活Orleans 只打开与释放单个连接不会释放数据源本身。从 RelationalStorage.cs 的OpenConnectionAsync可以看到两种路径的分流配置了DbDataSource时调用_dataSource.OpenConnectionAsync(...)否则通过DbConnectionFactory.CreateConnection(invariant, connectionString)手工创建连接再OpenAsync。声明式配置Declarative Configuration安装 ADO.NET 提供程序包后会自动注册AdoNet这个声明式 provider 类型。这样便可以在配置文件如appsettings.json中直接声明而无需编写代码。例如在一个应用中同时启用 AdoNet 集群、提醒与默认 Grain 存储{ Orleans: { ServiceId: orders, ClusterId: orders-production, Clustering: { ProviderType: AdoNet, Invariant: Microsoft.Data.SqlClient, ConnectionString: ... }, Reminders: { ProviderType: AdoNet, Invariant: Microsoft.Data.SqlClient, ConnectionString: ... }, GrainStorage: { Default: { ProviderType: AdoNet, Invariant: Microsoft.Data.SqlClient, ConnectionString: ... } } } }声明式配置与代码配置最终汇聚到同一套 Option 与 provider 构建器从 AdoNetClusteringProviderBuilder.cs 与 AdoNetGrainStorageProviderBuilder.cs 的源码结构看它们正是声明式配置ProviderType: AdoNet到UseAdoNetClustering/AddAdoNetGrainStorage的桥梁。[!IMPORTANT] 连接字符串属于机密信息应存放在密钥提供程序secret provider或部署环境变量中而不是提交到版本库的配置文件里。生产运维指导保持ClusterOptions.ServiceId稳定Orleans 依据它读取应用所属的行成员表、存储表按DeploymentId隔离。变更 ServiceId 会使其读取不到预期数据。连接池规模按“Silo 进程数 客户端进程数”的总量规划数据库连接池大小避免连接池耗尽。安全基线启用连接加密如 SQL Server 的EncryptTrue使用最小权限的数据库身份能使用托管身份managed identity的场景优先使用托管身份。监控指标持续监控数据库延迟、限流throttling、死锁与连接池耗尽。故障演练在负载下测试数据库故障转移与滚动部署行为。备份策略Grain 状态备份必须遵循应用的恢复目标RPO/RTO成员表membership行是瞬态数据不能替代状态备份。schema 升级从旧版本升级时检查并应用各 providerMigrations目录下的升级脚本当前仓库中可见的如 SQLServer-Clustering-3.7.0.sql、PostgreSQL-Persistence-3.6.0.sql、PostgreSQL-Reminders-3.6.0.sql 等。升级流程建议为按恢复策略备份数据 → 新库先跑主脚本 → 再跑各能力脚本 → 旧 schema 升级时依次审查并执行Migrations下的脚本 → 用同驱动、同数据库引擎版本的预发布集群验证。关于 Azure SQL 的托管身份如果连接的是 Azure SQLMicrosoft 建议使用**托管身份managed identities for Azure resources**作为认证方式——它是当前最安全的认证流程之一详见 managed-identities.md 中的官方说明。配合上文介绍的DbDataSource方案可以在数据源层完成基于托管身份/令牌的认证配置从而避免在连接字符串中存放静态凭据。延伸阅读与源码导航官方配套参考文档ADO.NET database configuration脚本与 invariant 总表官方代码示例片段HostingExamples.csadonet_silo/adonet_client/named_providers共享存储层invariant 常量、连接工厂、查询执行器、数据库常量表src/AdoNet/Shared各能力源码目录集群 src/AdoNet/Orleans.Clustering.AdoNet、持久化 src/AdoNet/Orleans.Persistence.AdoNet、提醒 src/AdoNet/Orleans.Reminders.AdoNet、Grain 目录 src/AdoNet/Orleans.GrainDirectory.AdoNet、流式传输 src/AdoNet/Orleans.Streaming.AdoNet赞分享后端微服务【免费下载链接】orleansCloud Native application framework for .NET项目地址https://gitcode.com/gh_mirrors/or/orleans点击查看免费下载相关推荐Orleans Google Cloud Firestore 提供程序配置指南集群、目录、持久化与提醒服务Orleans Google Cloud Firestore 提供程序配置指南集群、目录、持久化与提醒服务 本指南讲解如何在 Orleans 中使用 Goog后端微服务Orleans 关系数据库ADO.NETGrain 持久化实战指南SQL Server/MySQL/PostgreSQL/Oracle/SQLite 配置与原理Orleans 关系数据库ADO.NETGrain 持久化实战指南SQL Server/MySQL/PostgreSQL/Oracle/SQLite 配置后端微服务Orleans Grain 持久化深度指南IPersistentState、存储提供程序与状态演化Orleans Grain 持久化深度指南IPersistentState、存储提供程序与状态演化 Grain 持久化grain persistence是后端微服务上一篇SDWebImage 手动安装指南从源码构建 Framework、静态库与子工程集成的完整实践下一篇Agent Skills 开源仓库贡献指南从 Mintlify 文档站搭建到 AI 协作披露的完整实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PHPStan 错误标识符 property.writeOnly 详解:如何检测并修复对 `@property-write` 只写属性的读取

PHPStan 错误标识符 property.writeOnly 详解:如何检测并修复对 `@property-write` 只写属性的读取

开发工具代码质量静态分析 【免费下载链接】phpstan PHP Static Analysis Tool - discover bugs in your code without running it! 项目地址: https://gitcode.com/gh_mirrors/ph/phpstan 点击查看 免费下载 PHPStan 的 property.writeOnly 错误标识符&#xff08…

2026/9/24 17:18:24 阅读更多 →
FileZilla 快捷键速查手册:30 个核心键盘操作完整解析

FileZilla 快捷键速查手册:30 个核心键盘操作完整解析

FileZilla 快捷键速查手册:30 个核心键盘操作完整解析 【免费下载链接】reference ⭕ Share quick reference cheat sheet for developers. 项目地址: https://gitcode.com/gh_mirrors/re/reference FileZilla 是开发者与系统管理员最常用的开源 FTP/SFTP 客…

2026/9/24 17:18:24 阅读更多 →
一文搞懂openYuanrong:openEuler开源Serverless分布式计算引擎终极入门指南

一文搞懂openYuanrong:openEuler开源Serverless分布式计算引擎终极入门指南

一文搞懂openYuanrong:openEuler开源Serverless分布式计算引擎终极入门指南 【免费下载链接】yuanrong openYuanrong runtime:openYuanrong 多语言运行时提供函数分布式编程,支持 Python、Java、C 语言,实现类单机编程高性能分布式…

2026/9/24 17:18:24 阅读更多 →

最新新闻

C# WinForms+OpenCvSharp实现实时图像与TCP检测结果同窗显示

C# WinForms+OpenCvSharp实现实时图像与TCP检测结果同窗显示

简介:针对相机无法通过SDK直接取图、只能从本地文件读取场景,这份C#工程源码提供了一套图像与通信联动的检测可视化方案。程序基于System.Drawing与System.Net.Sockets实现两路并行:定时扫描本地文件夹并实时绘制最新图像,同时监听…

2026/9/24 18:10:58 阅读更多 →
JavaWeb电子相册毕设项目:JSP+Servlet+JDBC+MySQL实战全解析

JavaWeb电子相册毕设项目:JSP+Servlet+JDBC+MySQL实战全解析

简介:这份基于JavaWeb的电子相册毕设项目,是一套完整的网络相册管理系统源码包,面向计算机相关专业准备毕业设计的学生及需要项目实战的Java初学者,可直接作为毕设使用。系统采用B/S结构,前台支持用户注册登录、网站介…

2026/9/24 18:10:58 阅读更多 →
基于Python和CNN的人脸表情识别课程设计全流程解析

基于Python和CNN的人脸表情识别课程设计全流程解析

简介:这是一份基于深度学习的人脸表情识别系统完整实现,面向高校课程设计、毕业设计及计算机视觉初学者,解决从数据集处理、模型训练到实时表情识别落地的全流程问题。压缩包共19个文件、约10.81MB,其中10个Python脚本为核心源码&…

2026/9/24 18:10:58 阅读更多 →
Python+Django实战:高校学生违纪管理系统开发与数据建模

Python+Django实战:高校学生违纪管理系统开发与数据建模

简介:这套基于Python的高校学生违纪信息管理系统,面向教育信息化开发者、高校管理人员及需要搭建同类Web管理系统的技术人群,系统围绕学生违纪数据的录入、分类统计、处罚记录、报表导出、权限管理和预警通知等核心功能展开,能够显…

2026/9/24 18:10:58 阅读更多 →
JavaEE二手图书交易平台源码实战:分层架构与部署避坑指南

JavaEE二手图书交易平台源码实战:分层架构与部署避坑指南

简介:这是一套面向高校计算机相关专业学生的JavaEE课程设计完整资源,以二手图书交易平台为选题,适合作为期末大作业、课程设计或毕业设计参考,新手也能快速上手。资源包共173个文件,约25.68MB,涵盖21个Java…

2026/9/24 18:10:58 阅读更多 →
JavaEE二手图书交易平台实战:Spring+MyBatis从零搭建与避坑指南

JavaEE二手图书交易平台实战:Spring+MyBatis从零搭建与避坑指南

简介:这是一套面向高校计算机相关专业学生的JavaEE课程设计完整项目,以二手图书交易平台为主题,适合作为期末大作业、课程设计或毕业设计参考。项目采用Java语言开发,功能覆盖用户注册登录、图书发布、分类浏览、订单管理等核心业…

2026/9/24 18:09:58 阅读更多 →

日新闻

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

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

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

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →