手把手教你学Dapr - 5. 状态管理

介绍

使用状态管理,您的应用程序可以将数据作为键/值对存储在支持的状态存储中。

您的应用程序可以使用 Dapr 的状态管理 API 使用状态存储组件来保存和读取键/值对,如下图所示。例如,通过使用 HTTP POST,您可以保存键/值对,通过使用 HTTP GET,您可以读取键并返回其值。

a7bbf496f7e86b3038bc334d398e0181.png

特性

可插拔状态存储

Dapr 数据存储被建模为组件,可以在不更改代码的情况下更换它。例如:MySQL、Redis、Azure CosmosDB等。

可配置的状态存储行为

Dapr 允许开发人员将额外的元数据附加到状态操作请求中,用以描述请求的处理方式。如:

  • 并发要求

  • 一致性要求

默认情况下,您的应用程序应假定数据存储最终一致并使用最后写入获胜的并发模式

并发

Dapr 支持使用 ETags 的乐观并发控制 (OCC)。当请求状态时,Dapr 总是将 ETag 属性附加到返回的状态。当用户代码尝试更新或删除状态时,应该通过请求正文附加 ETag 以进行更新或通过 If-Match 标头进行删除。只有当提供的 ETag 与状态存储中的 ETag 匹配时,写操作才能成功。建议您在使用 ETag 时使用重试策略来补偿此类冲突。

如果您的应用程序在写入请求时省略 ETag,则 Dapr 在处理请求时会跳过 ETag 检查。与使用 ETag 的先写赢模式相比,这实质上启用了最后写赢模式。

自动加密

Dapr 支持应用程序状态的自动客户端加密,并支持密钥轮换。这是一项预览功能,所有 Dapr 状态存储都支持。

一致性

Dapr 支持强一致性和最终一致性,最终一致性作为默认行为。

  • 当使用强一致性时,Dapr 在确认写入请求之前等待所有副本(或指定的仲裁)确认。

  • 当使用最终一致性时,一旦底层数据存储接受写入请求,Dapr 就会立即返回,即使这是单个副本。

批量操作

Dapr 支持两种类型的批量操作 - 批量(bulk)或多(multi)。

:bulk与multi的区别在于bulk不是事务性的,multi是事务处理。

Actor状态

事务状态存储可用于存储Actor状态。要指定用于Actor的状态存储,请在状态存储组件的元数据部分中将属性 actorStateStore的值指定为 true

:Actors 状态以特定方案存储在事务状态存储中允许一致的查询。所以只能有一个状态存储组件被用于所有的Actor。

直接查询状态存储

Dapr 无需任何转换即可保存和检索状态值。您可以直接从底层状态存储查询和聚合状态。

例如,要在 Redis 中获取与应用程序 ID “myApp” 关联的所有状态键,请使用:

KEYS "myApp*"

查询Actor状态

如果数据存储支持 SQL 查询,您可以使用 SQL 查询查询参与者的状态。例如使用:

SELECT * FROM StateTable WHERE Id='<app-id>||<actor-type>||<actor-id>||<key>'

您还可以跨Actor实例执行聚合查询,避免Actor 框架常见的基于回合的并发限制。例如,要计算所有温度计Actor的平均温度,请使用:

保存并获取状态

状态管理是任何应用程序最常见的需求之一:新的或遗留的、单体或微服务。处理不同的数据库、测试、处理重试和故障可能既费时又费力。

先决条件

准备好Dapr运行环境可以看之前的文章

手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序

设置状态存储

Windows打开目录%USERPROFILE%\.dapr\components

  1. 创建文件statestore.yaml

  2. 使用redis作为状态存储的数据库

    apiVersion: dapr.io/v1alpha1
    kind: Component
    metadata:name: statestore
    spec:type: state.redisversion: v1metadata:- name: redisHostvalue: localhost:6379- name: redisPasswordvalue: ""- name: actorStateStorevalue: "true"

    :这个yaml已经通过actorStateStore开启了Actor状态

保存和检索单个状态

:设置 app-id 很重要,因为状态键以该值作为前缀。如果您不设置它,则在运行时为您生成一个,下次运行该命令时将生成一个新的,您将无法再访问以前保存的状态。换句话说,如果你要共享状态可以自定义一个保留app-id作为共享状态而不是留空。

运行Dapr Sidecar

运行一个空的Sidecar,因为我们只用它来帮助访问状态存储,所以与之前不同的是,dapr run后面没有接dotnet run去作为某一个程序的Sidecar

dapr run --app-id myapp --dapr-http-port 3500 --dapr-grpc-port 50001

创建客户端

创建控制台程序,添加Dapr.Client NuGet包引用。

修改Program.cs

using Dapr.Client;var storeName = "statestore";
var key = "myFirstKey";
var value = "myFirstValue";var client = new DaprClientBuilder().Build();
await client.SaveStateAsync(storeName, key, value);
Console.WriteLine("State has been stored");var data = await client.GetStateAsync<string>(storeName, key);
Console.WriteLine($"Got value: {data}");Console.ReadKey();

删除单个状态

await client.DeleteStateAsync(storeName, key);

通过事务保存和检索多个状态

Dapr 还允许您在同一个调用中保存和检索多个状态。

var lst = new List<StateTransactionRequest>()
{new StateTransactionRequest("test1", System.Text.Encoding.UTF8.GetBytes("value1"), StateOperationType.Upsert),new StateTransactionRequest("test2", System.Text.Encoding.UTF8.GetBytes("value2"), StateOperationType.Upsert),
};
await client.ExecuteStateTransactionAsync(storeName, lst);var datas = await client.GetBulkStateAsync(storeName, lst.Select(r => r.Key).ToList(), 0);
Console.WriteLine($"Got items: {string.Join(",", datas.Select(d => $"{d.Key}={d.Value}"))}");

强一致性

使用强一致性时,Dapr将确保底层状态存储在写入或删除状态之前,一旦数据被写入到所有副本或收到来自quorum的ack,就会返回响应。

对于GET请求,Dapr 将确保存储在副本之间一致地返回最新数据。默认为最终一致性,除非在对状态 API 的请求中另有说明。

await client.SaveStateAsync(storeName, key, value, new StateOptions() { Consistency = ConsistencyMode.Strong });var etagData = await client.GetStateAndETagAsync<string>(storeName, key, ConsistencyMode.Strong);
Console.WriteLine($"ETag:{etagData.etag}");await client.DeleteStateAsync(storeName, key, new StateOptions() { Consistency = ConsistencyMode.Strong });

先写赢和最后写赢

Dapr 允许开发人员在使用数据存储时选择两种常见的并发模式:首先写入获胜`最后写入获胜。First-Write-Wins 在您有多个应用程序实例的情况下很有用,所有实例都同时写入同一个键。

Dapr 的默认模式是最后写入获胜

下面的例子展示了如何获取一个 ETag,然后使用它来保存状态,然后删除状态:

await client.SaveStateAsync(storeName, key, value, new StateOptions() { Concurrency = ConcurrencyMode.FirstWrite });
var firstWriteWinData = await client.GetStateAndETagAsync<string>(storeName, key);
var etag = firstWriteWinData.etag;await client.TrySaveStateAsync(storeName, key, DateTime.Now.Ticks.ToString(), etag, new StateOptions() { Concurrency = ConcurrencyMode.FirstWrite });
var firstWriteWinDeleteSucceeded = await client.TryDeleteStateAsync(storeName, key, etag);
Console.WriteLine($"First write wins delete:{firstWriteWinDeleteSucceeded}");firstWriteWinData = await client.GetStateAndETagAsync<string>(storeName, key);
firstWriteWinDeleteSucceeded = await client.TryDeleteStateAsync(storeName, key, firstWriteWinData.etag);
Console.WriteLine($"First write wins delete:{firstWriteWinDeleteSucceeded}");

:这里演示了ETag在更新后尝试删除失败的例子,最后再重新获取新的状态以修正ETag再删除

在不同的应用程序之间共享状态

为了实现状态共享,Dapr 支持以下键前缀策略

  • appid - 这是默认策略。appid 前缀允许状态只能由具有指定 appid 的应用程序管理。所有状态键都将以 appid 为前缀,并以应用程序为范围。

  • name - 此设置使用状态存储组件的名称作为前缀。对于给定的状态存储,多个应用程序可以共享相同的状态。

  • none - 此设置不使用前缀。多个应用程序在不同的状态存储之间共享状态

举个例子:要指定前缀策略,请在状态组件上添加名为 keyPrefix 的元数据键

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: statestorenamespace: production
spec:type: state.redisversion: v1metadata:- name: keyPrefixvalue: <key-prefix-strategy>

:此示例演示相对较复杂,思路大概是使用多个statestore.yaml,然后根据不同的storename切换不同策略即可。感兴趣的小伙伴可以自行尝试。

自动加密状态并管理密钥轮换

:截止目前,这个功能是个预览版,感兴趣的小伙伴可以自行尝试

应用程序状态通常需要静态加密,以在企业工作负载或受监管环境中提供更强的安全性。Dapr 提供基于 AES256 的自动客户端加密。

状态的生存时间(TTL)

Dapr 为每个状态在请求时设置生存时间 (TTL)。这意味着应用程序可以为每个存储的状态设置生存时间,并且这些状态在到期后无法检索。

:只有一部分 Dapr 状态存储组件与状态 TTL 兼容。对于支持的状态存储,只需在发布消息时设置 ttlInSeconds 元数据。其他状态存储将忽略此值。

await client.SaveStateAsync(storeName, key, value, metadata: new Dictionary<string, string>() { { "ttlInSeconds", "3" } });
var ttlData = await client.GetStateAsync<string>(storeName, key);
Console.WriteLine($"TTL Data:{ttlData}");Thread.Sleep(5000);
ttlData = await client.GetStateAsync<string>(storeName, key);
Console.WriteLine($"TTL Data:{ttlData}");

持久化状态

要显式设置持久化状态(忽略为键设置的任何 TTL),请将 ttlInSeconds 值指定为 -1

本章源码

Assignment05

https://github.com/doddgu/dapr-study-room

我们正在行动,新的框架、新的生态

我们的目标是自由的易用的可塑性强的功能丰富的健壮的

所以我们借鉴Building blocks的设计理念,正在做一个新的框架MASA Framework,它有哪些特点呢?

  • 原生支持Dapr,且允许将Dapr替换成传统通信方式

  • 架构不限,单体应用、SOA、微服务都支持

  • 支持.Net原生框架,降低学习负担,除特定领域必须引入的概念,坚持不造新轮子

  • 丰富的生态支持,除了框架以外还有组件库、权限中心、配置中心、故障排查中心、报警中心等一系列产品

  • 核心代码库的单元测试覆盖率90%+

  • 开源、免费、社区驱动

  • 还有什么?我们在等你,一起来讨论

经过几个月的生产项目实践,已完成POC,目前正在把之前的积累重构到新的开源项目中

目前源码已开始同步到Github(文档站点在规划中,会慢慢完善起来):

MASA.BuildingBlocks

MASA.Contrib

MASA.Utils

MASA.EShop

BlazorComponent

MASA.Blazor

QQ群:7424099

微信群:加技术运营微信(MasaStackTechOps),备注来意,邀请进群

357018d19198ef8726d354b721817309.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之drawlayout使用和总结

DrawLayout 今天发的Android之SlidingMenu博客之后,有人说out了,说用DrawLayout,我插,被叼了,然后我就到网上查drawLayout是什么?原来是侧滑菜单,好吧,赶快学习下,网上很多例子,都不怎么全面,然后找了找了呀,终于找到到了个成形的,然后自己改了下,不说了,先爆照 …

eclipse 汉化教程(语言包)

Eclipse 汉化图形教程此教程仅仅以links方式安装eclipse插件&#xff0c;且接下来主要以eclipse安装语言包为例&#xff0c;如果教程过程中哪里不对&#xff0c;请指出&#xff0c;谢谢。因使Eclipse版本太多&#xff0c;我这里就以eclipse3.5.2为例&#xff0c;讲讲如何将其汉…

4. MyBatis几个可以优化的地方

与其说是优化, 还不如说是让配置更简单.一: 连接数据库的配置单独放到一个属性文件中在 src 路径下新建一个 db.properties 属性文件, 并把数据库连接信息放入文件中, 然后在 conf.xml 文件中导入属性文件引用就可以了, 这样更好管理.1. 新建 db.properties 文件2. 写入属性信息…

免费使用的支付宝,到底是怎么一年赚1206亿的?

全世界只有3.14 % 的人关注了爆炸吧知识眨眼间&#xff0c;马云居然退休已经一年了&#xff0c;真可谓白驹过隙&#xff0c;恍惚而逝啊&#xff01;不过&#xff0c;你以为马云退休了&#xff0c;就清风明月&#xff0c;万事不管了。太年轻&#xff01;其实马云依旧掌控者蚂蚁集…

C#中使用opencv处理图像

OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库&#xff0c;可以运行在Linux、Windows、Android、ios等操作系统上&#xff0c;它轻量级而且高效---由一系列C函数和少量C类构成&#xff0c;同时提供了Python、Ruby、MATLAB等语言的接口…

php psr 编码规范_PHP之PSR-4规范:自动加载

1. 概述本 PSR 是关于由文件路径 自动载入 对应类的相关规范&#xff0c;本规范是可互操作的&#xff0c;可以作为任一自动载入规范的补充&#xff0c;其中包括 PSR-0&#xff0c;此外&#xff0c;本 PSR 还包括自动载入的类对应的文件存放路径规范。关于「能愿动词」的使用为了…

两台服务器虚拟成一个ip地址,两台服务器如何用一个ip地址

两台服务器如何用一个ip地址 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。检查Pkey是否一致。查看弹性云服务器内部分配到的Pkey…

SQL注入漏洞全接触--高级篇

2019独角兽企业重金招聘Python工程师标准>>> 看完入门篇和进阶篇后&#xff0c;稍加练习&#xff0c;破解一般的网站是没问题了。但如果碰到表名列名猜不到&#xff0c;或程序作者过滤了一些特殊字符&#xff0c;怎么提高注入的成功率?怎么样提高猜解效率?请大家接…

除了沉迷酒色之外,你还做过什么?

1 是了&#xff0c;说的就是我▼2 你这叫落井又下石...▼3 如何让衣服瞬间好看&#xff1f;▼4 自己品品...▼5 买家秀与卖家秀▼6 舍友的水杯...妥妥养生局&#xff01;▼7 还有...▼你点的每个赞&#xff0c;我都认真当成了喜欢

ssl certificate 验证

2019独角兽企业重金招聘Python工程师标准>>> 生成certificate&#xff1a; client 验证certificate&#xff1a; 转载于:https://my.oschina.net/u/255456/blog/545568

使用C#开发交互式命令行应用

前言如果你开发过vue应用&#xff0c;应该对其交互式命令行印象深刻&#xff1a;它允许你无需任何编程经验&#xff0c;仅需回答问题&#xff0c;就可完成vue应用创建。虽然作为.NETer&#xff0c;大部分情况下我们不会使用命令行&#xff0c;但是还是希望能用C#开发出这样的交…

300 s7 置零指令_西门子1200与200、200 SMART置位复位指令的区别

S7-1200的位逻辑指令&#xff0c;这也是我们在学习PLC编程时最先接触到的指令&#xff0c;最基本的指令。位逻辑运算指令是对二进制位进行操作的指令&#xff0c;数据类型是BOOL型&#xff0c;这其中又包括了触点指令与赋值指令、置位与复位指令、沿脉冲检测指令这三个部分。在…

惊现试衣间照片流出??

1 论断句的重要性▼2 这是个有味道的手机壳▼3 啊这...就挺秃然的&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 男朋友的瘦肉礼物&#xff08;via.苍南派&#xff09;▼5 哭泣吧&#xff0c;打工人&#xff01;&#xff01;▼6 朋友送的生日礼物被子还是衣服啊…

【转载】创建型-工厂方法模式

介绍&#xff1a;在简单工厂模式中&#xff0c;我们提到&#xff0c;工厂方法模式是简单工厂模式的一个延伸&#xff0c;它属于Gof23中设计模式的创建型设计模式。它解决的仍然是软件设计中与创建对象有关的问题。它可以更好的处理客户的需求变化。引入我们继续来说"new&q…

主机挂载存储_备战CKA每日一题——第3天 | 对接CSI存储知识

本活动在微信公众号【我的小碗汤】上举行&#xff0c;这里参与答题无效哦&#xff01; 昨日考题 在Kubernetes PVCPV体系下通过CSI实现的volume plugins动态创建pv到pv可被pod使用有哪些组件需要参与&#xff1f; A. PersistentVolumeController CSI-Provisoner CSI controll…

Android之Android Studio常用插件

Android Studio常用插件 Android Studio常用插件ButterKnife Zelezny官网&#xff1a;http://jakewharton.github.io/butterknife/github&#xff1a;https://github.com/JakeWharton/butterknife功能&#xff1a;将光标停留在Activity中onCreate方法中setContentView方法的xml…

招人!招人!这篇推文不要标题,只要你!

对&#xff0c;没错&#xff0c;就是这么直接超模君要要要要招人了因为我们知道很多有才华有能力的人并没有找到适合自己的工作比如你每当夜幕降临躺在床上仰望星空&#xff08;望着天花板&#xff09;的时候你的内心是不是都充满了迷茫&#xff1f;但&#xff0c;这并不是你的…

用python爬虫抓站的一些技巧总结

转自http://obmem.info/?p476 1.最基本的抓站 import urllib2 content urllib2.urlopen(http://XXXX).read() -2.使用代理服务器这在某些情况下比较有用&#xff0c;比如IP被封了&#xff0c;或者比如IP访问的次数受到限制等等。 import urllib2 proxy_support urllib2.Prox…

第六届中国开源年会(COSCon'21)开心开源精彩收官

“ 点击蓝字 / 关注我们 ”第六届中国开源年会开心开源 Happy Hacking精彩收官&#xff01;开源社作为国内第一个专注于开源治理、国际接轨、社区发展&#xff0c;以及开源项目的开源社区&#xff0c;完全由志愿贡献于开源事业的个人成员组成。 由开源社主办的 “中国开源年会 …

matlab浮点数求绝对值_MATLAB仿真阵列天线切比雪夫综合法(附代码)

来源&#xff1a;cnblogs在《自适应天线与相控阵》这门课中&#xff0c;了解到了关于理想低副瓣阵列设计的一些方法&#xff0c;其中切比雪夫等副瓣阵列设计方法是一种基础的方法&#xff0c;故将其设计流程写成maltab程序供以后学习使用。在此分享一下。 此方法全称为道尔夫-切…