我參與了阿里巴巴 ASoC-Seata 的一些感悟 參與的起因 參與的過程 收穫與體會 導師的幫助-Mentor's help 總結

看一看日曆
這個不同尋常的 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 方法:


@Override
    public 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 會成爲萬衆矚目的分佈式事務解決方案。

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章