.NET分布式Orleans - 5 - 持久化
在分布式系统中,数据的持久化是至关重要的一环。
Orleans 7 引入了强大的持久化功能,使得在分布式环境下管理数据变得更加轻松和可靠。
本文将介绍什么是 Orleans 7 的持久化,如何设置它以及相应的代码示例。
什么是 Orleans 7 的持久化?
Orleans 7 的持久化是指将 Orleans 中的状态数据持久化到外部存储介质,以便在应用程序重新启动或节点故障时能够恢复数据。
这对于构建可靠的分布式系统至关重要,因为它确保了数据的持久性和一致性。
持久化使得 Orleans 可以在不丢失数据的情况下处理节点故障或应用程序的重新启动。
它还可以用于支持扩展性和负载平衡,因为数据可以在集群中的不同节点上进行分布式存储。
Orleans 7 的持久化怎么设置?
持久化目前支持以下数据库:
- SQL Server
- MySQL/MariaDB
- PostgreSQL
- Oracle
我们拿SQL Server举例,首先需要安装基础包
Install-Package Microsoft.Orleans.Persistence.AdoNet
按照以下链接,创建对应的数据库表
https://learn.microsoft.com/zh-cn/dotnet/orleans/host/configuration-guide/adonet-configuration
并进行ADO.NET配置
var invariant = "System.Data.SqlClient"; var connectionString = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=orleanstest;User Id=sa;Password=1234;"; // Use ADO.NET for clustering
siloHostBuilder.UseAdoNetClustering(options =>
{
options.Invariant = invariant;
options.ConnectionString = connectionString;
}).ConfigureLogging(logging => logging.AddConsole()); ;
siloHostBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "SampleApp";
});
// Use ADO.NET for persistence
siloHostBuilder.AddAdoNetGrainStorage("GrainStorageForTest", options =>
{
options.Invariant = invariant;
options.ConnectionString = connectionString;
});
如何使用
可使用IPersistentState<TState> 的实例作为构造函数参数注入到 grain 中。
并可以使用 PersistentStateAttribute 属性批注这些参数,以标识要注入的状态的名称,以及提供该状态的存储提供程序的名称。
public class ProfileState
{
public string Name { get; set; }
public Date DateOfBirth { get; set; }
}
public interface IUserGrain : IGrainWithStringKey
{
Task<string> GetNameAsync();
Task SetNameAsync(string name);
}
public class UserGrain : Grain, IUserGrain
{
private readonly IPersistentState<ProfileState> _profile; public UserGrain([PersistentState("profile", "GrainStorageForTest")] IPersistentState<ProfileState> profile)
{
_profile = profile;
} public async Task<string> GetNameAsync()
{
await _profile.ReadStateAsync();
return await Task.FromResult(_profile.State.Name);
} public async Task SetNameAsync(string name)
{
_profile.State.Name = name;
await _profile.WriteStateAsync();
}
}
也可以使用Grain<TState> 为 grain 添加存储
[StorageProvider(ProviderName="store1")]
public class MyGrain : Grain<MyGrainState>, /*...*/
{
/*...*/
}
.NET分布式Orleans - 5 - 持久化的更多相关文章
- java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘
15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; ...
- .NetCore实践篇:分布式监控Zipkin持久化之殇
前言 本系列已写了四篇文章,读本篇之前,可以先读前面几篇. 思考大纲:.Net架构篇:思考如何设计一款实用的分布式监控系统? 实践篇一:.NetCore实践篇:分布式监控客户端ZipkinTracer ...
- Microsoft Orleans构建高并发、分布式的大型应用程序框架
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...
- 分布式缓存技术redis学习(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性.目录如下: 安全性设置 设置客户端操作秘密 客户 ...
- 分布式缓存技术redis系列(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...
- Microsoft Orleans 之 入门指南
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- Orleans简单配置
Orleans简单配置 这是Orleans系列文章中的一篇.首篇文章在此 话说曾几何时,我第一次看到xml文件,心中闪过一念想:"这<>是什么鬼?"-用ini或者jso ...
- Orleans的集群构建
Orleans的集群构建 这是Orleans系列文章中的一篇.首篇文章在此 听闻一周前,微软公布了.net core2.0,以及各种各样的其他core2.0.大家都很兴奋.微妈的诚意真是满满的.这次开 ...
- Microsoft Orleans 之安装
先决条件 Orleans 是一个.net 类库集,为了使用它,你需要.net 4.5.1 或者更高版本,开发工具集需要visual studio 2015 或者更高版本或者其他支持的开发工具,不支持V ...
随机推荐
- NVME(学习笔记_杂谈)
NVME 协议中一些概念的理解: 1.Namespace :可以将Namespace 理解为一片Logic Block的区域,一个Controller可以支持多个Namespace,每个Namespa ...
- Java容器及其常用方法汇总
1 概述 Java Collections 框架中包含了大量的接口及其实现类和操作它们的算法,主要包括列表(List).集合(Set).映射(Map),如下: 接口 实现类 数据结构 初始容量 加载因 ...
- python web连接mysql数据库
一定要commit,否则数据库不会发生改变!!! 1.使用python写入内容到数据库 import pymysql # 记得下载并引入pymysql # 1.连接mysql,db:声明数据库 con ...
- kafka学习笔记03-消息生产者producer
kafka学习笔记03-消息生产者producer 发送消息整体流程示意图 消息发送的流程示意图: (From:High-level overview of Kafka producer compon ...
- 项目打包setup.py(setuptools)
参考 https://www.cnblogs.com/dan-baishucaizi/p/13564333.html https://www.cnblogs.com/dan-baishucaizi/p ...
- 用NavigationManager实现订单的列表和新增页面之间的导航
1.在订单列表页面放置"新增"按钮 2.注入NavigationManager,按钮被点击后导航到新增订单的路径 3.测试一下,能工作了. 4.订单新增后,返回订单列表页面 5.测 ...
- JAVA 考试管理系统 大作业(一):需求分析
好家伙,有需要的拿去借鉴吧(虽然我也百度了很多) 题目如下: 题目四:考试管理系统 (选做要求:使用图形用户界面) 分3种用户角色:教务员(具有管理权限).教师.学生 l 教务员:可以进行用户管理( ...
- Kubernetes:Pod 端口映射
本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址: https://k8s.whuanle.cn[适合国内访问] https://ek8s.whuanl ...
- 方便快速的看到C/C++代码汇编 objdump 英特尔语法
目录 概述 Objdump 所有参数 其他的 概述 因为奇怪的考试要求,最近经常有奇怪的问题,例如为什么(++a)+(++a)=14 发现反编译出汇编之后,就能解释很多奇怪的问题 Objdump 一次 ...
- C语言之牛必克拉斯 main() 函数
C语言之main()函数 C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的 ...