一、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_事务,租约相关推荐

  1. 分布式学习(6)etcd@3@ API v3 gRPC_range,put,deleterange

    1 gRPC Services  发送到etcd服务器的每个API请求都是一个gRPC. 在etcd3中的RPCs会根据功能分类到不同的service中. 1.1 Services important ...

  2. Google Maps API V3学习--- 简单地图显示

    技术发展日新月异,为了与时俱进,不让自己很快的落伍,正好项目有所需要,就学习了下 新发布的Google Maps API V3. V3相对于V2存在许多改变,比如在地图的加载上,尤其是手机浏览器访问的 ...

  3. 谷歌地图api v3学习之:起步

    最近公司项目需要用到地图搜索功能,首先考虑的是gmap(谷歌地图api),一开始觉得它很神秘很难,但经过几天的研究发现其实很简单.谷歌官网api写的很详细,一目了然 .在此用的是version3版本, ...

  4. etcd http API

    在docker中启动etcd 参考 https://etcd.io/docs/v3.5/op-guide/container/ 启动后,假定服务监听在192.168.1.21:2379. 基本示例 r ...

  5. aes加密 java_Java中的微信支付(2):API V3 微信平台证书的获取与刷新

    1. 前言 在Java 中的微信支付(1):API V3 版本签名详解一文中胖哥讲解了微信支付 V3 版本 API 的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API 证书对参数 ...

  6. 微信支付API V3版本JAVA开发指南

    微信支付版本V3的Demo,在官方上下载下来,压根就是不能直接用的东西,你要想学会用,你就得一层一层的看源码,看文档,要求你事无巨细的做一个接入者. 如果接入API需要让人看源码来理解,我觉得是一件让 ...

  7. Go 分布式学习利器(16) -- go中可复用的package构建

    通过本文,你将了解go 语言中如何将自己的package构建到项目中 以及如何将远程(github)的package构建到项目中. 1. 构建本地的package package 是可复用模块的基本单 ...

  8. Redis学习笔记 - 数据类型与API(1)Key

    Redis学习笔记 - 数据类型与API(1)Key Key相关命令 1. 常用命令 命令 含义 时间复杂度 keys 查找所有符合给定模式 pattern 的 key O(N), N 为数据库中 k ...

  9. Java中的微信支付(2):API V3 微信平台证书的获取与刷新

    1. 前言 在Java 中的微信支付(1):API V3 版本签名详解一文中胖哥讲解了微信支付 V3 版本 API 的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API 证书对参数 ...

最新文章

  1. WP8.1学习系列(第五章)——中心控件Hub或透视控件Pivot交互UX
  2. ORA-04063: view SYS.DBA_REGISTRY has errors
  3. IT人回家过年的尴尬
  4. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU特性介绍(3)- 命名规则
  5. 数据 3 分钟 | 农行因存在数据泄露风险被罚420万元、Databricks最新融资10亿美元...
  6. c语言程序设计实践教程编程题8.3,C语言程序设计教程(21世纪计算机科学与技术实践型教程)...
  7. 细胞增殖曲线_高中生物高分技巧13-细胞增殖
  8. 2021年中国以太网测试设备市场趋势报告、技术动态创新及2027年市场预测
  9. 成为iPhone游戏开发者的十大秘技
  10. 雷达存在感应器技术,实时感知控制应用,雷达人体探测方案
  11. 微机计算机继电保护原理,微机继电保护的发展历史
  12. 迈高图手机版_迈高图地图下载
  13. .net core 跨平台UI框架 Avalonia
  14. <EDEM 基础案例 01>SAG Mill
  15. vue 解决跨域问题
  16. 非淡泊无以明志,非宁静无以致远。
  17. VMware12安装win7图文教程
  18. Kylin接入外部Jdbc Mysql数据源
  19. 安装WordPress的一些注意事项
  20. 2021.5.13如何安装APK到手机

热门文章

  1. VB:编一个子过程DeleStr(s1,s2),将字符串s1中出现的s2子字符串删去,结果存放在s1中
  2. mysql报错1593_主从复制报1593错误的处理
  3. python解一元二次方程虚根_Python编程实现数学运算求一元二次方程的实根算法示例...
  4. poi word转html 根号,二次根式计算题-20210402033540.docx-原创力文档
  5. 优化:java递归实现笛卡尔积算法
  6. Java程序员未来的三大就业方向
  7. 区块链的希望与原罪:从金融场景谈起
  8. 用Java写一个五子棋小游戏
  9. 三维视觉 | 03 MATLAB 单、双目相机标定
  10. 25 岁,毕业写前端的这三年,多益网络java面试