为了防止并发对数据修改造成差异,dapr使用了etag标签来作为版本号,对数据修改进行验证。

下面是对etag的一个demo

appsettings.json中的url配置

"StateUrl": "http://localhost:3500/v1.0/state/statestore"

在PaymentSystem项目中添加两个action

[HttpPost("/writekeyswithetag")]public async Task<IActionResult> WriteKeysWithEtag([FromBody] KeyEntityWithEtag[] keys){var client = _clientFactory.CreateClient();var jsonContent = System.Text.Json.JsonSerializer.Serialize(keys);var content = new StringContent(jsonContent);var response = await client.PostAsync(_stateUrl, content);return Ok(await response.Content.ReadAsStringAsync());}[HttpGet("/readekeywithetag/{key}")]public async Task<IActionResult> ReadKeyWithEtag(string key){var client = _clientFactory.CreateClient();var response = await client.GetAsync($"{_stateUrl}/{key}");      var dataString = await response.Content.ReadAsStringAsync();var data = (string.IsNullOrEmpty(dataString) ? null : System.Text.Json.JsonSerializer.Deserialize<OrderPayment>(dataString));return new JsonResult(new { result = true, data = new { data = data, etag = response.Headers.SingleOrDefault(s => s.Key.ToLower() == "etag") }, host = Dns.GetHostName() });}

实体类

public class OrderPayment
{public string PayOrder { get; set; }public decimal PayTotal { get; set; }public string PayType { get; set; }public DateTime PayTime { get; set; }
}
public class KeyEntityWithEtag
{public string Key { get; set; }public OrderPayment Value { get; set; }public string Etag { get; set; }
}

docker-compose.yml

version: '3.4'services:#┌─────────────────────────┐#│ Dapr placement1 service │#└─────────────────────────┘  placement:image: "daprio/dapr"command: ["./placement", "-port", "50006"]ports:- "50006:50006"networks:- b2c-dapr#┌────────────────────┐#│ Redis1 state store │#└────────────────────┘  redis:image: "redis:latest"ports:- "6380:6379"networks:- b2c-dapr#┌───────────────────────────────────┐#│ paymentsystem1 app + Dapr sidecar │#└───────────────────────────────────┘  paymentsystem1:image: ${DOCKER_REGISTRY-}paymentsystemdepends_on:- redis- placementbuild:context: ../dockerfile: /PaymentSystem/Dockerfileports:- "3601:3500"volumes:   - ../PaymentSystem:/PaymentSystem      networks:- b2c-dapr      paymentsystem1-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "pay", "-app-port", "80","-placement-host-address", "placement:50006","-components-path","/components" ]build:context: ../depends_on:- paymentsystem1network_mode: "service:paymentsystem1"volumes:   - ../components:/components #┌───────────────────────────────────┐#│ paymentsystem2 app + Dapr sidecar │#└───────────────────────────────────┘   paymentsystem2:image: ${DOCKER_REGISTRY-}paymentsystemdepends_on:- redis- placement build:context: ../dockerfile: /PaymentSystem/Dockerfilevolumes:   - ../PaymentSystem:/PaymentSystem            ports:- "3602:3500"networks:- b2c-dapr      paymentsystem2-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "pay", "-app-port", "80" ,"-placement-host-address", "placement:50006","-components-path","/components"]build:context: ../depends_on:- paymentsystem2network_mode: "service:paymentsystem2"volumes:   - ../components:/components
networks:b2c-dapr:

提交带有etag标签的数据,多提交几次,可以把etag顶起来

查看etag为非1

这时再次提交就会报错,如果另外的服务更新了这个值,本次提交就会失败,需要再次查询后更新,或作别的业务逻辑处理。

Dapr牵手.NET学习笔记:状态管理进阶(二)相关推荐

  1. Dapr牵手.NET学习笔记:状态管理之docker-compose发布

    Dapr牵手.NET学习笔记:想入非非的服务调用 Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用 Dapr牵手.NET学习笔记:用docker-compose部署服务 说明:为了给出demo的 ...

  2. Dapr牵手.NET学习笔记:开篇

    dapr,一个为分布式应用程序的运行时,为开发者在对接分布式组件时,提供了便利.使用dapr带来的好处可扩展性,因为它是通过sidecar的理概念来集成其他运行时的.同时dapr还提供了多种语言的SD ...

  3. Dapr牵手.NET学习笔记:状态管理进阶(一)

    在上一篇文章中说到,dapr默认的状态是不可能跨appid的,也就是只能在相同的应用内访问自己设置的状态数据,dapr支持三种状态的共享配置:appid,nam,none,是通过修改component ...

  4. Dapr牵手.NET学习笔记:想入非非的服务调用

    demo运行环境:Windows10,Docker(dapr_zipkin,dapr_redid,dapr_placement) 安装:dapr init 卸载:dapr uninstall,然后删除 ...

  5. Dapr牵手.NET学习笔记:Actor一个场景

    接上一篇最后的场景,为了解决相同帐户并发引起的数据库行级锁,可以引入Actor的串机制,相同ActorID的实例,串行,这样就能在应用层把读取余额的资源争抢解决掉,剩下的工作就是一定时间间隔,把内存中 ...

  6. Dapr牵手.NET学习笔记:Actor小试

    Actor模型是一种避免线程共享数据,相同Actor实体串行化的方案,所以不便dapr的其他功能,几乎都是非编程入侵的,相反,Dapr Acror深度定制的,关于Actor,.net中有一些通用框架, ...

  7. Dapr牵手.NET学习笔记:可观测性-分布式跟踪

    分布式跟踪在dapr里是开箱即用的,不需要对应用作任何一丁点的侵入式编程.之前的开发,如果想实现分式跟踪,就得在应用中埋点,这是一个与业务无关系的动作.dpar通过sidecar可以轻松做到这点,从而 ...

  8. Dapr牵手.NET学习笔记:绑定

    绑定有点像订阅发布,但又不一样,绑定更简单,绑定输出(调用方)-绑定输入(被调用方). 本例是用docker compose编排,并且用rabbitMQ来支持,因为rabbitMQ支持输入和输出绑定. ...

  9. Dapr牵手.NET学习笔记:发布-订阅

    queue,是很好的削峰填谷工具,在业内也是主流:发布订阅,可以有效的解耦两个应用,所以dapr把他们进行了有效的封装,我们使用起来更简单高效. 本篇的案例是下完订单后,会把消息发布到redis(当然 ...

最新文章

  1. MongoDB系列:二、MongoDB常用操作练习
  2. 制胜人工智能时代——企业人工智能应用现状分析(第三版)
  3. 大话软件测试与职业生涯
  4. ThreadLocal内存泄漏问题
  5. php把网络图片转化为base64格式,解决html2canvas图片跨域问题
  6. 中科点击矩阵式推进大数据落地与应用
  7. 37 | 案例篇:DNS 解析时快时慢,我该怎么办?
  8. BZOJ2442: [Usaco2011 Open]修剪草坪 单调队列优化dp
  9. AG9 Service order创建好之后,要自动通过middleware传其他系统去 disable
  10. mysql 主从 不一致_揭秘MySQL主从数据不一致
  11. selenium课程笔记1---安装与环境配置(selenium,python,pycharm)
  12. Oracle监听注册和sqlnet,Oracle监听配置(四)--如何实现静态、动态注册
  13. 机器人学导论复习笔记
  14. Apache HttpClient4使用教程
  15. Mybatis-Plus
  16. 十三、直接、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址
  17. mysql视图出问题如何解决_MySQL视图
  18. 在鹅厂如何带薪刷视频?
  19. CSS学习笔记——动画进阶(八音盒动画效果)
  20. springcloud:访问/bus/refresh地址后出现错误,,client端出现以下错误

热门文章

  1. HDU4462-稻草人
  2. I want go to school
  3. 对Emlog 6.0 Beta的完整代码审计过程
  4. Linux中写入ISO镜像
  5. EntityFramework6.X 之 Fulent
  6. centos打架django + mysql环境
  7. mongoDB 高级查询之取模查询$mod
  8. js(jQuery)获取时间的方法及常用时间类
  9. JavaScript自动设置IFrame高度(兼容各主流浏览器)
  10. 开源播放器 Banshee 发布 1.0 beta 2