惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
K
Kaspersky official blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog
aimingoo的专栏
aimingoo的专栏
M
MIT News - Artificial intelligence
小众软件
小众软件
云风的 BLOG
云风的 BLOG
腾讯CDC
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
Stack Overflow Blog
Stack Overflow Blog
量子位
S
Secure Thoughts
G
GRAHAM CLULEY
C
CXSECURITY Database RSS Feed - CXSecurity.com
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
T
Threat Research - Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
G
Google Developers Blog
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
C
Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 聂微东
宝玉的分享
宝玉的分享
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
Forbes - Security
Forbes - Security
Engineering at Meta
Engineering at Meta
S
Security Affairs
Help Net Security
Help Net Security
博客园 - 三生石上(FineUI控件)
AWS News Blog
AWS News Blog
博客园 - 叶小钗
Recent Commits to openclaw:main
Recent Commits to openclaw:main
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
Project Zero
Project Zero
H
Heimdal Security Blog
W
WeLiveSecurity
C
Check Point Blog

文章 - 硬盘在歌唱 on 硬盘在歌唱

Open Prompt:AI 时代的 PR 协作新范式 记一例浮点数精度问题 AI 辅助编程时代,哪些编程语言会更流行? 从认知心理学看代码可读性 父子对谈30则 都2024了,你还没随身带录音笔吗? 写段子的窍门 给TiDB(MySQL)写一个代理网关 论怎么与基层干部打成一片 怎么做一个匿名论坛 适合程序员的桌面窗口管理方案 Go语言泛型初体验 双中心主从模式 TrueTime和原子钟 价值10万元的TiDB Hackathon创意 TiDB1024谜题解题报告 Paxos从入门到学会Raft 一个小故事,关于科幻,关于老师 beancount 复式记账实践
价值6万元的TiDB Hackathon创意
2020-12-17 · via 文章 - 硬盘在歌唱 on 硬盘在歌唱

前两天发表了价值10万元的TiDB Hackathon创意,反响还不错。可惜这个项目最大的问题是投入成本过大,至今没有天使投资人出现。所以只好再发一个,这次的特点就是成本低,见效快,投入产出比高!

先说问题。

TiKV并不单纯是给TiDB用的,作为CNCF的开源项目,是Cloud Native基础设施的一块重要拼图。如果想以各种有趣的姿势来玩耍TiKV,我们首先需要有客户端来跟TiKV进行交互,这是绕不过去的。

遗憾的是,到目前为止,我们只有一个功能完备,生产环境验证的TiKV客户端——就是内嵌在TiDB里的那一个。如果要使用的话,需要引入庞大的TiDB依赖,更要命的是,只支持Go一种语言。

虽然我们有一些其他语言的port版本,比如 Java,Rust,C,不过大多数功能有缺失。而且没经过充分验证,生产环境也不太敢上。不得不说,这对社区很不友好了。

所以Hackathon项目就是搞多种语言的客户端呗?

并非如此,实际上我怀疑两天时间写一个客户端都是完成不了的,因为开发一个TiKV客户端其实很难。主要体现在:

  • 客户端是分布式事务的协调者,需要处理大量微妙的事务逻辑
  • 客户端需要从PD查Region元信息,并维护一部分缓存
  • 客户端要处理各种错误和异常
  • 需要port大量的单元测试和集成测试来保证正确性

我想做的是充分利用现有的资源,做一个TiKV客户端测试框架,让客户端的测试验证变得更容易。开发客户端的时候,不用再写测试了,这不仅可以节省工作量,而且使用标准的流程来验证客户端,可以让我们对不同实现的质量更有信心。

我们看图说话,描述一下工作原理。

客户测试框架宏伟蓝图

TestAdapter

为了接入测试框架,用户需要为开发中的客户端写一点简单的胶水层代码来跟测试框架交互,也就是TestAdapter。TestAdapter需要按照协议启动一个HTTP服务,本质上就是一个创建和调用Client的代理。

MockTiKV / MockPD

客户端的测试经常依赖于TiKV/PD的特殊状态,比如Region发生leader切换,或者Region在特定的位置分裂,或者TiKV宕机,等等。

但是我们在测试的过程中,不太可能去启动一套真正的集群,而且更不太可能去精细地控制集群的内部状态。所以目前TiDB的做法是用Go写了个假集群,也就是MockTiKV/MockPD,它们提供跟真正集群一样的gRPC服务,同时暴露一些接口来设置内部状态。

测试的启动(蓝色箭头)

开发者把TestAdapter的URI填入测试框架的网页输入框,点击开始测试。

测试框架在后台开启测试任务,并依次运行准备好的所有测试用例。

测试运行(黄色箭头)

每个测试在运行过程中会先创建Mock集群,然后把Mock集群的服务地址交给TestAdapter,创建一个或多个Client实例。随后,测试用例不断地给TestAdapter和Mock集群发消息来完成测试。

举个例子吧,比如测RawPut这个功能,过程就是先通过TestAdapter调用Client的RawPut接口,随后再调用Mock集群的RawGet接口看看是不是被写入了。

测试的过程中通过Admin API来控制Mock集群的状态,甚至通过failpoint注入一些错误。

测试报告(紫色箭头)

每个测试用例的结果返回给测试任务,汇总后生成测试报告展示在网页上。

客户端可以选择只支持部分功能,比如只支持RawKV,或者只支持2PC TxnKV。测试报告也做一个分门别类,分别指明客户端对于每种功能是通过,不支持,或者有bug。对于有bug的情况,可以提供相关的运行日志供检查。


这一套框架长期来看收益应该是很好的。在减轻客户端开发者负担的同时,最大的好处就是测试用例可以复用,当我们发现新bug后,可以做到一次添加就测试所有客户端的效果。后面我们还可以在官网上做一个大的客户端Dashboard,方便开发者进行选择。

与此同时,这个项目做起来工作量也不大。MockTiKV和MockPD可以复用之前的代码,只是要封装网络层。测试用例也可以从TiDB现有的代码移植,同样用Go语言的话移植成本也会比较低。

最后还有个彩蛋,就是这个项目其实之前我跟几个小伙伴已经做了一些微小工作了(tikv/client-validatortikv/mock-tikv),后来由于个人原因(主要是懒)没有继续。当时的进展其实已经不错了,可以以命令行的方式运行并输出简单的报告,不过测试用例是很缺的,只有rawkv的简单功能测试。

大体上就是这样了,有兴趣的话,记得来联系我啊。