分布式学习(7)etcd@3@ API v3 gRPC_事务,租约
一、ETCD 之 事务
在etcdv3中,事务就是一个原子的、针对key-value存储操作的If / Then / Else 结构,事务提供了一个原语,用于请求归并到一起放在原子块中,例如then/else,这些原子块的执行条件,例如if以key-value存储里的内容为依据。事务可以用来保护key不受其他并发更新操作的修改,也可以构建CAS(Compare And Swap)操作,并以此作为更高层次(应用层)并发控制的基础。在一个事务请求中,etcd可以自动处理多个普通的请求。若对于那些修改key-value存储的请求,若用同一个事物所有操作产生的事件都拥有同样的revesion。然而,在一个事务中多次修改同一个key是被禁止的。
所有的事务都由一个比较“连接”来守护,类似于“if”声明。每个比较会检查后台存储的一个key。这个检查可以是如下内容:该key在后台存储是否有value?该key的value是否等同于某个给定的值?除了value,还可以检查这个key的revision或者version。有的比较都是原子的执行的。如果所有的比较都返回true,那么就说该事物成功了,并且会执行该事务success请求块里面的操作,反之则代表该事务失败了,转而执行该事务failure请求块里面的操作。
一个事务由一个 比较块 和 比较后的操作 两个部分组成,数据结构如下:
# Request message TxnRequest {repeated Compare compare = 1;repeated RequestOp success = 2;repeated RequestOp failure = 3; } # Response message TxnResponse {ResponseHeader header = 1;bool succeeded = 2;repeated ResponseOp responses = 3; }
所有的比较都由下面的message表示:
message Compare {enum CompareResult {EQUAL = 0;GREATER = 1;LESS = 2;NOT_EQUAL = 3;}enum CompareTarget {VERSION = 0;CREATE = 1;MOD = 2;VALUE= 3;}CompareResult result = 1;// target is the key-value field to inspect for the comparison.CompareTarget target = 2;// key is the subject key for the comparison operation.bytes key = 3;oneof target_union {int64 version = 4;int64 create_revision = 5;int64 mod_revision = 6;bytes value = 7;} }
在处理完上述比较块后会进行下一步的操作,比如说CRUD,如下所示:
message RequestOp {// request is a union of request types accepted by a transaction.oneof request {RangeRequest request_range = 1;PutRequest request_put = 2;DeleteRangeRequest request_delete_range = 3;} }
二、ETCD 之 watch API
watch api 提供了基于事件的接口,用于异步检测key的变换,etcd v3的watch机制会针对某个key 下的某个特定revision进行连续的检测,等待key发生变化后将更新信息返回给client
每个变换的数据结构都如下所示:
message Event {enum EventType {PUT = 0;DELETE = 1;}EventType type = 1;KeyValue kv = 2;KeyValue prev_kv = 3; }
watch是长期持续的操作,并且它使用gRPC中的流的方式进行传输Event数据,(这里的流是双向流);一个方面,client通过写入流来创建watch,另一个方面,client通过读取流来接受到watch的Event,单个watch流可以通过使用pre-watch标志Event,以达到在一个流中多路传输多个不同的watch event的目的,如下是request和response的数据结构
# Request message WatchCreateRequest {bytes key = 1;bytes range_end = 2;int64 start_revision = 3;bool progress_notify = 4;enum FilterType {NOPUT = 0;NODELETE = 1;}repeated FilterType filters = 5;bool prev_kv = 6; }# Response message WatchResponse {ResponseHeader header = 1;int64 watch_id = 2;bool created = 3;bool canceled = 4;int64 compact_revision = 5;repeated mvccpb.Event events = 11; }
三、ETCD 之 Lease API
租约是一种检测客户端活跃度的机制,Lease机制的应用比较广泛,如用于授权进行同步等操作,用于分布式锁等场景。租约是由生存限制的,集群为租约授予一个TTL,当key被授予某个Lease时,它的生存时间为Lease的生存时间。Lease的实际TTL值不低于最小的TTL,而该最小值是由etcd集群选择的。当Lease的TTL到期时,所有与之关联的key都将被删除。如果在TTL结束前没有收到租约及KeepAlive消息来维持租约,那么该租约将过期。etcd3所支持的Lease机制可以为etcd集群中的某个key或者多个key所关联,一个key最多关联一个Lease。
租约request和租约过期收到的response,以及撤销租约的数据结构如下:
# request message LeaseGrantRequest {int64 TTL = 1;int64 ID = 2; }# response message LeaseGrantResponse {ResponseHeader header = 1;int64 ID = 2;int64 TTL = 3; }# 撤销 message LeaseRevokeRequest {int64 ID = 1; }
下面时租约,KeepAlive的数据结构:
# request message LeaseKeepAliveRequest {int64 ID = 1; }# response message LeaseKeepAliveResponse {ResponseHeader header = 1;int64 ID = 2;int64 TTL = 3; }
四、ETCD 之 gRPC gateway & pure python
#watch curl http://localhost:2379/v3alpha/watch \-X POST -d '{"create_request": {"key":"Zm9v"} }' & # {"result":{"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"1","raft_term":"2"},"created":true}} curl -L http://localhost:2379/v3alpha/kv/put \-X POST -d '{"key": "Zm9v", "value": "YmFy"}' >/dev/null 2>&1 # {"result":{"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"2","raft_term":"2"},"events":[{"kv":{"key":"Zm9v","create_revision":"2","mod_revision":"2","version":"1","value":"YmFy"}}]}}# 事务 curl -L http://localhost:2379/v3alpha/kv/txn \-X POST \-d '{"compare":[{"target":"CREATE","key":"Zm9v","createRevision":"2"}],"success":[{"requestPut":{"key":"Zm9v","value":"YmFy"}}]}' # {"header":{"cluster_id":"12585971608760269493","member_id":"13847567121247652255","revision":"3","raft_term":"2"},"succeeded":true,"responses":[{"response_put":{"header":{"revision":"3"}}}]}
# 事务from etcd3 import Client client = Client('127.0.0.1', 12379) #事务 start txn = client.Txn() txn.compare(txn.key('foo').value == 'bar') txn.success(txn.put('foo2', 'bar2')) txn.commit() #事务 end print(client.range('foo2').kvs)#租约 from etcd3 import Client client = Client('127.0.0.1', 12379) myleaseId = 303030 mylease = client.lease_grant(30, myleaseId) client.put('foo3', 'bar3', myleaseId) lease_info = client.lease_time_to_live(myleaseId) # lease_keep_alive(myleaseId) print(lease_info)
分布式学习(7)etcd@3@ API v3 gRPC_事务,租约相关推荐
- 分布式学习(6)etcd@3@ API v3 gRPC_range,put,deleterange
1 gRPC Services 发送到etcd服务器的每个API请求都是一个gRPC. 在etcd3中的RPCs会根据功能分类到不同的service中. 1.1 Services important ...
- Google Maps API V3学习--- 简单地图显示
技术发展日新月异,为了与时俱进,不让自己很快的落伍,正好项目有所需要,就学习了下 新发布的Google Maps API V3. V3相对于V2存在许多改变,比如在地图的加载上,尤其是手机浏览器访问的 ...
- 谷歌地图api v3学习之:起步
最近公司项目需要用到地图搜索功能,首先考虑的是gmap(谷歌地图api),一开始觉得它很神秘很难,但经过几天的研究发现其实很简单.谷歌官网api写的很详细,一目了然 .在此用的是version3版本, ...
- etcd http API
在docker中启动etcd 参考 https://etcd.io/docs/v3.5/op-guide/container/ 启动后,假定服务监听在192.168.1.21:2379. 基本示例 r ...
- aes加密 java_Java中的微信支付(2):API V3 微信平台证书的获取与刷新
1. 前言 在Java 中的微信支付(1):API V3 版本签名详解一文中胖哥讲解了微信支付 V3 版本 API 的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API 证书对参数 ...
- 微信支付API V3版本JAVA开发指南
微信支付版本V3的Demo,在官方上下载下来,压根就是不能直接用的东西,你要想学会用,你就得一层一层的看源码,看文档,要求你事无巨细的做一个接入者. 如果接入API需要让人看源码来理解,我觉得是一件让 ...
- Go 分布式学习利器(16) -- go中可复用的package构建
通过本文,你将了解go 语言中如何将自己的package构建到项目中 以及如何将远程(github)的package构建到项目中. 1. 构建本地的package package 是可复用模块的基本单 ...
- Redis学习笔记 - 数据类型与API(1)Key
Redis学习笔记 - 数据类型与API(1)Key Key相关命令 1. 常用命令 命令 含义 时间复杂度 keys 查找所有符合给定模式 pattern 的 key O(N), N 为数据库中 k ...
- Java中的微信支付(2):API V3 微信平台证书的获取与刷新
1. 前言 在Java 中的微信支付(1):API V3 版本签名详解一文中胖哥讲解了微信支付 V3 版本 API 的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API 证书对参数 ...
最新文章
- WP8.1学习系列(第五章)——中心控件Hub或透视控件Pivot交互UX
- ORA-04063: view SYS.DBA_REGISTRY has errors
- IT人回家过年的尴尬
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU特性介绍(3)- 命名规则
- 数据 3 分钟 | 农行因存在数据泄露风险被罚420万元、Databricks最新融资10亿美元...
- c语言程序设计实践教程编程题8.3,C语言程序设计教程(21世纪计算机科学与技术实践型教程)...
- 细胞增殖曲线_高中生物高分技巧13-细胞增殖
- 2021年中国以太网测试设备市场趋势报告、技术动态创新及2027年市场预测
- 成为iPhone游戏开发者的十大秘技
- 雷达存在感应器技术,实时感知控制应用,雷达人体探测方案
- 微机计算机继电保护原理,微机继电保护的发展历史
- 迈高图手机版_迈高图地图下载
- .net core 跨平台UI框架 Avalonia
- <EDEM 基础案例 01>SAG Mill
- vue 解决跨域问题
- 非淡泊无以明志,非宁静无以致远。
- VMware12安装win7图文教程
- Kylin接入外部Jdbc Mysql数据源
- 安装WordPress的一些注意事项
- 2021.5.13如何安装APK到手机
热门文章
- VB:编一个子过程DeleStr(s1,s2),将字符串s1中出现的s2子字符串删去,结果存放在s1中
- mysql报错1593_主从复制报1593错误的处理
- python解一元二次方程虚根_Python编程实现数学运算求一元二次方程的实根算法示例...
- poi word转html 根号,二次根式计算题-20210402033540.docx-原创力文档
- 优化:java递归实现笛卡尔积算法
- Java程序员未来的三大就业方向
- 区块链的希望与原罪:从金融场景谈起
- 用Java写一个五子棋小游戏
- 三维视觉 | 03 MATLAB 单、双目相机标定
- 25 岁,毕业写前端的这三年,多益网络java面试