我参与阿里巴巴 ASoC-Seata 的一些感悟
作者 | 侯志
来源|阿里巴巴云原生公众号
看一看日历
这个不同寻常的 2020 年,马上就要结束了。
这一年,有幸参与阿里巴巴组织 ASoC 活动,有一段让我难忘的不平凡经历。
这一年,却已可以称为是国际开源实习发展历程中不平凡的一年。
参与的起因
初心
Beginner’s mind
唯有守得住初心,才能日益精进。
我先来说说 Seata 这个项目的 idea 是怎么来的。一直就有参与开源项目的打算,一个事物的兴起必定或大或小引发一定的问题,微服务就是这样,分布式事务概念泛化的同时,也带来了一个技术问题,微服务架构下分布式数据一致性该如何保证?这几年涌现出不少分布式事务框架,比如 ByteTCC、TCC-transaction、EasyTransaction 以及最近很火爆的 Seata。想要破解罪恶,就必须接近它,甚至成为它。我是去年 8 月份从 GitHub 开始关注 Seata 项目的,初步熟悉后,我觉得它的设计理念非常好,并对它产生了浓厚的兴趣,那个时候就萌发了我要成为这个项目的贡献者。偶然的机会看到 Seata issue,发现了 ASoC 这个活动。
参与的过程
- 有期待,更美好
Expect better
在参与活动之前我就先从官方文档开始了解过 Seata ,并根据自己的了解,做了一些简单的梳理。看 Seata 源码,继续深入研究,更多的是关注于 SqlParser 模块,在这个过程中,我发现 SqlParser 模块是用 Druid 实现,(Druid 不过多介绍),且 Seata 对于 SqlParser 部分解析功能受限于 Druid,为了方便用户使用,Seata 更加灵活使用数据库语言解析, 有必要扩展一种新的 SqlParser 方案。由于之前有了解过 Antlr,感觉其更加灵活、拓展性更强、层次清晰更易维护。例如 Hive 和 Spark 使用 Antlr 生成词法语法解析器,Twitter 使用 Antlr 来解析用户输入的查询内容,Oracle 把 Antlr 的功能内嵌在 SQL 开发 IDE 中,NetBeans IDE 使用 Antlr 解析 C ++ 语言,也有公司使用 Antlr 来从文件中抽取信息等等…
Antlr 无疑是 Seata SqlParser 另一个更好的选择。于是我想把 Antlr 带到 Seata 中。
- 迷惑
**Confuse **
在开发任务期间,Antlr 模块是一个 feature 的实现,涉及 Seata 关于数据库语言解析的一块(有前辈开发者使用 Druid 去处理相关数据库语言数据,因此我进行了 Druid 源码深入研究,基本类似于使用 Antlr 实现一种轻量级别的 Druid),而整个实现过程,太多的地方需要确定,包括实现数据库种类、Antlr 源文件、Antlr 模块划分,以及明确上下游 API 接口等等。在实现解析数据库每种语法语句的时候,比如 Mysql 新增语法,使用 Antlr Visitor 模式,并不兼容查询、修改、删除语法,不断打翻之前的代码,不断调试,甚至导致 Antlr 源文件变动(Antlr 官方提供的源文件过大,改动很头疼)。最终采用 Antlr 两种解析模式去解析。Listener 针对于查询、修改,删除语法包括批量操作,最终问题得以解决。
- 顿悟
Epiphany
字符串流重写 LA 遍历方法。这里使用 Antlr v4.0.0 字符串流重写 LA 遍历方法,否则大小写转换出错,调用 MySqlLexer 进行词法分析、CommonTokenStream 符号分析、MySqlParser 执行语法规则分析,调用我们自定义的 InsertSpecificationSql,visit 去遍历 Ast 树,把解析出的信息用 MySqlContext 展示。过程很简单,但是在实际过程中可能会遇到很多问题,比如新增语法、查询语法、修改语法、删除语法以及它们语法规则是否有通用性、实现的方法是否可以公用;不同的 sql 语法,是否同一个方法能支持;批量 sql 的话,怎么去处理等等问题。
在解析 mysql 原生 sql 语句时候,遇到这样一个问题,解析出的 sql 明明是对的,Ast 视图树中也正确,但是返回给客户会出现下面这种情况:
原生 sql 居然把空格都给省略掉,一开始我先执行 Ast 树,查询解析结果,发现没有问题,一激灵我想到不是有词法关键词吗,分析时候肯定是基于 Mysql 关键字的,然后把使用到 Mysql 关键词的字符加了空格,重写生成文件,发现是没有问题的。但这词法太多了吧,我都改掉解析会不会出现问题?果真好多解析出现了问题,导致 Seata 生成前后镜像出现问题。遇到事情不能急躁,冷静…它不是有 Ast 树吗,我在它遍历 Ast 树的时候给它加上空格不就好了吗?这样原生的词法文件根本不需要动,也不会引起后续问题,我赶紧阅读起了 Antlr java 源码,功夫不负有心人,果真找到了解决办法,我重写了 visitTerminal 方法:
@Overridepublic StringBuilder visitTerminal(TerminalNode node) {String text = node.getText();if (text != null && !"".equals(text.trim())) {if (shouldAddSpace(text.trim())) {sb.append(" ");}sb.append(text);}return sb;}private boolean shouldAddSpace(String text) {if (sb.length() == 0) {return false;}char lastChar = sb.charAt(sb.length() - 1);switch (lastChar) {case '.':case ',':case '(':return false;default:break;}switch (text.charAt(0)) {case '.':case ',':case ')':return false;default:break;}return true;}
收获与体会
思维-编程能力
Thinking-programming ability
参与 Seata 过程中在社区认识了很多优秀的开发者,这些开发者很多是值得我去学习的,有不理解的地方我的前辈导师包括社区朋友都热心帮我解决。每个阶段完成后,都会有一个小的总结,还参与了 PR Code Review,学习到了开源项目常用的设计模式、SPI 和结构设计等。可以说是学到了优秀的编码习惯和思维方式。
参与到开源项目中并贡献自己的一份力量并没有想象中的难,凡事不要太着急,一步一步、脚踏实地的稳步前进,每天都要有点收获就会不断的成长,开源项目中的大牛很多,参与开源会使自己变得更加谦卑,还会让自己的思维变得更开阔,不会局限于自我。
出色完成工作所带来的成就感,实在是种难以言喻的宝贵体验。还有什么更好的选择能比加入开源项目带来更为广阔的平台?为开源项目作出贡献能够让你体会到从无到有构建成果的满足感,并因此得到承认与感激。必须承认的是,拥有开源软件贡献经历能够让我们的简历变得光彩照人。而朋友们恰好都在使用这款软件,由此带来的激励效果要远远超过每天枯燥完成的业务应用代码。这种感觉很赞,真的很赞。
导师的帮助-Mentor’s help
季敏(slievrly)前辈是我的导师,从学习 Seata 到第一次提交 Seata pr 期间,前辈总是很耐心地回答我的每一个问题,即使是在他比较忙的时候。有时会自己会问一些比较白痴的问题,他总是细心的给我指点迷津、点出问题所在以及为什么会导致这个问题;有时遇到一些技术方向的问题时,前辈也会给出具有指导性的意见。可以说,一直是他推着我前进,因此在这里感谢前辈的耐心指导,同时也感谢社区张嘉伟大佬、陈健斌大佬、钟正涛大佬在我的编程之夏之旅中提供的帮助。
总结
目前 Seata 已经是 Github 上一个大热的项目,Seata 社区非常活跃,并且在快速更新迭代。项目的技术思想是好的,分布式事务的模式也不止一种,使用方便、高效。本文主要讨论了 Seata 结合 antlr 实现 sqlparser 方面的相关内容,如果有对 Seata 项目或是对 sqlparser 方面、antlr 领域熟悉感兴趣的朋友,期待你们加入 Seata 社区一起交流学习!相信 Seata 会成为万众瞩目的分布式事务解决方案。
我参与阿里巴巴 ASoC-Seata 的一些感悟相关推荐
- 邀您参与 | 阿里巴巴如何扩展 K8s 调度器支持 AI 和大数据任务?
简介:2020 年 7 月 15 日上午 10:00,<阿里巴巴如何扩展 K8s 调度器支持 AI 和大数据任务?>主题线上网络研讨会即将召开. 随着 Kubernetes 的广泛应用,越 ...
- 2014阿里巴巴校园招聘的一些感悟
2014阿里巴巴校园招聘 本来只是抱着试一试的心态去参加2014年阿里巴巴校园招聘(本人大三,2015年毕业),所报岗位:前端工程师. 首先阿里2014校园招聘前端是在线笔试的,前5道题目谈各种人生理 ...
- 研发路上的总结和思考 -----来自阿里巴巴中间插件----作者:石佳宁
最重要的是选择,最困难的是坚持. 我是在 2014 年入职饿了么,从前端和 PHP 一直做到后端架构和团队,从 2014 年到 2017 年陆续负责过公司客服.销售.代理商.支付.清结算.订单这些业务 ...
- 阿里巴巴“相信小的伟大”:用普世情怀传播小力量
来源 | 公关界007 2018年的平昌冬季奥运会将于今年2月份开幕,这意味将掀起一股对奥林匹克话题关注的浪潮. 视频加载中... 2017 年 1 月 19 日,国际奥林匹克委员会与阿里巴巴集团在瑞 ...
- 马云卸任阿里巴巴CEO演讲全文:因为信任,所以简单!
以下是全文: 马云:大家晚上好!谢谢各位,谢谢大家从全国各地,我知道也有从美国.英国和印度来的同事,感谢大家来到杭州,感谢大家参加淘宝的十周年! 今天是一个非常特别的日子,当然对我来讲,我期待这一天很 ...
- 国企生存感悟(必读篇)
毕业一年,入职一年,竟然没心没肺的活了一年,真是少不更事!自己都嫌弃自己幼稚无知!所幸现在明白的还不太晚.我真是后知后觉的那种人,不摔坑就不知道前面有坑,不撞墙就不知道要回头!不被教训就不知道吸取别人 ...
- 26个顶级开源项目,87个开放任务,阿里巴巴编程之夏2022学生报名通道开启
站在2022年的时间节点回看开源, 它已经从一个小众的爱好者行为 变成了技术圈的主流, 不变的是, 开源像有引力一样吸引着全球的开发者, 超越国籍.语言的差异, 围绕着自己认可的开源项目, 不断地使用 ...
- 卫哲加盟阿里巴巴满百日:他干了些什么?
卫哲这位最年轻的跨国公司中国区CEO,在加盟阿里巴巴刚满百日的时间里,他做了三件事情,主要是明确战略:参与阿里巴巴新的三年.五年的发展规划:将买家体验提升到战略高度,重新推出买家发展和服务部门,增加海 ...
- 阿里巴巴集团的首次公开募股
阿里巴巴集团的首次公开募股(IPO)已迫在眉睫,预计会在本周晚些时候,潜在的投资者或许想知道,在这宗有望成为美国甚至是全球有史以来最大规模的IPO中,有哪些人在出售股票套现?还有这些股票又来自何处? ...
最新文章
- 最新 30 道 Dubbo 面试题及答案
- 垃圾要分类!我们的大脑如何处理垃圾呢?
- 如何实现windows和linux之间的文件传输
- opencv 图像增强_图像增强、锐化,利用 Python-OpenCV 帮你实现 4 种方法!
- html下拉菜单jq怎么设置,jquery+css实现下拉列表功能
- VxWorks嵌入式操作系统的TrueFFS文件系统驱动开发
- java 动态添加定时器_quartz实现任务动态增加和删除
- Oracle :备份 、还原数据库
- php装逼的面试问题,面试读心术,教你如何优雅的在面试官前装逼
- iOS系统自带正则表达式简单运用
- eclipse汉化版的问题
- 百度 bos php,Thinkphp5对接百度云对象存储 BOS(代码示例)
- Ubuntu 18.04下为Firefox浏览器安装flash插件
- MATLAB2014a的安装
- 当前HNB资讯加热不燃烧产品与传统中烟加热卷烟有哪些区别?
- switchport mode access
- apex英雄哪个服务器稳定,apex英雄哪个服务器好
- 如何以管理员身份运行命令提示符或终端窗口
- Delphi写游戏外挂
- windows关闭445、3389端口
热门文章
- C/C++得到系统启动项
- Apache 反向代理,Laravel获取用户真实IP
- 2、HTML <img>标签(插入图片)
- 1.2 @Override注解
- 红黑树(一)之 原理和算法详细介绍
- 万能笔记本,你值得拥有;(XML)
- jQuery的Prettydate插件
- jQuery的Validate插件
- ServletConfig接口
- python消息队列celery_消息队列(kafka/nsq等)与任务队列(celery/ytask等)到底有什么不同?...