天天看點

我參與阿裡巴巴 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 視圖樹中也正确,但是傳回給客戶會出現下面這種情況:

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

原生 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 會成為萬衆矚目的分布式事務解決方案。