- LegiNote專案開發故事1 - 構想
- StatPan以提升國會法案及會議紀錄的可及性,並利用AI提升立法效率為目標,啟動了LegiNote專案。
AI 翻译的文章。
durumis AI 总结的文章
- LegiNote 專案為了開發 Web 服務,使用了 Svelte、Rust、Go、Python 等技術,其中使用 Go 開發的 Worker 主要負責 OpenAPI 資料的收集與更新。
- Worker 負責執行資料收集邏輯設定、執行、載入資料庫等功能,並以支援各種 API 資料的擴展性為目標。
- 專案為了將相依性降到最低,採用按功能區分資料夾的方式進行架構,並使用 PostgreSQL、pq、sqlx 等工具來連接資料庫並處理查詢。
您好,我是 StatPan。
正在撰寫 LegiNote 這個副業專案的開發歷程。
上一篇請參考以下連結。
基本架構
太陽兔子贊助 Leginote 設計
Leginote 主要以開發為 Web 服務為目標,預計會使用以下技術堆疊。
前端:Svelte
後端:Rust(非常考慮使用 rupring,但可能會變動)
工作器:Go(追求除了必要相依性以外,極度使用 std)
數據分析:Python(從前處理到未來的人工智慧應用)
在上述技術堆疊中,我主要貢獻的領域是工作器和數據分析部分,預計會以這兩個部分為主軸撰寫開發歷程。
首先,讓我們談談工作器。
工作器
語言選擇
golang 標誌
我一開始是用 Python 學習程式設計,而且目前主要的工作領域是數據科學,因此 Python 語言對我來說最熟悉。但是,只會腳本語言的我開始渴望擁有堅固的編譯語言,因此開始對 Go 和 Rust 語言產生興趣。
特別是最近一直關注的語言是 Rust,Rust 通常會與 C++ 和 Golang 一起被提及。(當然,C++ 也是一種優秀的語言,但在這種網路服務開發中,我把它排除在外了。未來,除非是處理深度學習框架內部,否則我不太確定我是否會直接使用它。)
學習 Rust 和 Golang 並嘗試用它們來處理簡單的網路請求後,我簡單地了解了 Rust 和 Golang 的優缺點。在這篇文章中,深入探討兩者的優缺點會讓文章太長,所以我認為最好在另一篇文章中單獨整理,在此只簡單提及一下。
在網路領域中,不需要額外相依性就能組成,而且對於一個不確定是否能產生營收的未知專案來說,Golang是最佳選擇。
工作器角色
OpenAPI 畫面
工作器的角色是每隔一段時間透過 OpenAPI 網站收集和更新數據,可以分為以下三種:
1. 設定特定資訊的收集邏輯
2. 設定執行收集邏輯的執行器
3. 將收集到的數據載入資料庫
目標是將上述三個步驟相同的程序應用於各種 API 數據,並持續擴展。
專案結構規劃
專案結構有多種架構,特別是使用框架可以讓專案從一開始就具備結構。但是,如上所述,本專案的目標是將相依性降到最低,因此希望盡可能貼近定義的邏輯,並將每個功能分開到不同的資料夾中。
專案結構如下所示:
leginote-worker-bill/
├── main.go
├── api/
│ └── client.go
├── db/
│ ├── connection.go
│ └── repository.go
├── util/
│ ├── error.go
│ └── runner.go
│ └── config.go
├── worker/
│ └── worker.go
├── go.mod
└── go.sum
api - 數據收集是透過公用數據 OpenAPI 進行的。因此,與 OpenAPI 通訊的基本代碼會放在 api 資料夾下。目前,只有一個 API 作為主要使用,因此只有一個用戶端檔案。
db - 定義了與資料庫通訊的邏輯。connection 內部的代碼只負責連線,repository 包含了各種 upsert SQL 並執行其邏輯。SQL 本身存在於代碼中會太複雜,因此我打算之後將 SQL 放在單獨的檔案中。
util - 定義了在工作過程中輔助功能的各種邏輯。error 是臨時建立的腳本,用於方便處理 Go 中產生的錯誤結果。在後續的開發故事中,您將看到這會造成巨大的蝴蝶效應(?)
config 檔案是在讀取 .env 檔案時,為了不使用額外的套件,而直接定義讀取 .env 檔案的函數的檔案。
worker - 包含了使用 api 和 db 邏輯來產生所需動作的主要邏輯。如果之後工作器的種類增加,也需要相應地增加,但目前只包含一個主要工作器的動作。
之後,我計劃在保持分層架構原則的基礎上,持續改進代碼。
專案相依性
用於 postgres 的 pq
用於查詢的 sqlx
工作器結語
只列出理論而沒有代碼,感覺有點無聊,我自己也覺得有點拖沓,所以結束得有點快。
第二篇就到此結束了。希望從第三篇開始,可以加入更多代碼,並進行討論。
在 LegiNote 開發過程中,如果您有任何認為需要的功能,或者對開發有任何疑問,歡迎隨時留言!