- Kisah Pengembangan Proyek LegiNote 1 - Ide
- StatPan memulai proyek LegiNote dengan tujuan meningkatkan aksesibilitas terhadap rancangan undang-undang dan notulen rapat DPR serta meningkatkan efisiensi pembentukan undang-undang dengan memanfaatkan AI.
Teks yang diterjemahkan oleh AI.
Ringkasan posting oleh durumis AI
- Proyek LegiNote memanfaatkan Svelte, Rust, Go, dan Python untuk pengembangan layanan web, khususnya worker yang dikembangkan dengan Go berperan dalam pengumpulan dan pembaruan data OpenAPI.
- Worker menjalankan fungsi pengaturan logika pengumpulan data, eksekusi, dan pemuatan ke DB, dengan tujuan untuk mencapai skalabilitas pada berbagai data API.
- Proyek ini disusun dengan memisahkan folder berdasarkan fungsi untuk meminimalkan dependensi, dan menggunakan PostgreSQL, pq, dan sqlx untuk koneksi dan penanganan query database.
Halo, saya StatPan.
Saya sedang menulis tentang pengembangan proyek sampingan LegiNote.
Untuk bagian sebelumnya, silakan lihat tautan berikut.
Arsitektur Dasar
Kontribusi dari 태양토끼님 (Taeyangtokki) untuk Desain Leginote
Leginote akan dikembangkan sebagai layanan web, dan kami berencana untuk menggunakan tumpukan teknologi berikut.
Frontend: Svelte
Backend: Rust (sangat mempertimbangkan rupring, tetapi dapat berubah)
Worker: Go (mengutamakan penggunaan std secara ekstrem, kecuali dependensi yang diperlukan)
Analisis Data: Python (dari prapemrosesan hingga integrasi kecerdasan buatan di masa mendatang)
Dari tumpukan teknologi ini, saya berencana untuk fokus pada pengembangan bagian worker dan analisis data, yang merupakan area kontribusi utama saya, dalam seri postingan blog ini.
Mari kita mulai dengan membahas worker.
Worker
Pemilihan Bahasa
logo golang
Saya memulai pemrograman dengan Python, dan karena pekerjaan utama saya saat ini berada di bidang ilmu data, saya paling terbiasa dengan bahasa Python. Namun, karena hanya menguasai bahasa scripting, saya mulai tertarik pada bahasa kompilasi yang lebih kokoh, seperti Go dan Rust.
Terutama, bahasa yang paling menarik perhatian saya baru-baru ini adalah Rust, yang sering kali disebutkan bersamaan dengan C++ dan Golang. (Tentu saja, C++ juga merupakan bahasa yang hebat, tetapi saya tidak menyertakannya dalam pengembangan layanan jaringan ini. Saya juga tidak yakin apakah saya akan langsung menggunakannya di masa mendatang, kecuali jika saya menangani bagian dalam kerangka kerja deep learning.)
Setelah mempelajari Rust dan Golang, dan menggunakannya untuk permintaan jaringan sederhana, saya memperoleh pemahaman dasar tentang kelebihan dan kekurangan masing-masing bahasa. Akan terlalu panjang jika saya membahas kelebihan dan kekurangan kedua bahasa ini di sini, jadi saya akan membahasnya secara terpisah di postingan lain. Singkatnya,
Untuk proyek yang tidak pasti apakah akan menghasilkan pendapatan, dan untuk membangunnya tanpa dependensi tambahan di bidang jaringan, saya memutuskan untuk menggunakanGolang.
Peran Worker
Layar OpenAPI
Peran worker adalah mengumpulkan dan memperbarui data melalui situs OpenAPI secara berkala, yang dapat dibagi menjadi tiga bagian berikut.
1. Mengatur logika pengumpulan untuk informasi tertentu
2. Mengatur peluncur yang menjalankan logika pengumpulan
3. Memuat data yang dikumpulkan ke dalam DB
Tujuannya adalah untuk menerapkan dan memperluas tiga langkah ini secara identik ke berbagai data API.
Cara Mengatur Proyek
Ada berbagai arsitektur untuk mengatur proyek, dan menggunakan kerangka kerja dapat membantu memulai proyek dengan struktur yang telah ada. Namun, seperti yang disebutkan sebelumnya, tujuan proyek ini adalah untuk meminimalkan dependensi selama pengembangan. Oleh karena itu, saya ingin memisahkan setiap folder berdasarkan fungsi agar lebih dekat dengan logika yang telah ditentukan.
Proyek ini akan diatur sebagai berikut.
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 - Pengumpulan data dilakukan melalui OpenAPI data publik. Oleh karena itu, kode dasar untuk berkomunikasi dengan OpenAPI akan berada di bawah folder api. Saat ini, hanya ada satu API utama yang digunakan, sehingga hanya ada satu file klien.
db - Logika untuk berkomunikasi dengan DB didefinisikan di sini. Kode di dalam connection hanya menangani koneksi, sedangkan repository berisi logika untuk menjalankan berbagai SQL upsert. Saya berencana untuk membuat SQL sebagai file terpisah di masa mendatang karena menempatkan SQL langsung dalam kode akan menjadi terlalu rumit.
util - Ini adalah tempat di mana berbagai logika pendukung untuk tugas-tugas didefinisikan. error adalah skrip sementara yang dibuat untuk memproses hasil error yang dikeluarkan oleh Go dengan lebih mudah. Seperti yang akan Anda lihat dalam cerita pengembangan selanjutnya, ini akan menjadi penyebab efek kupu-kupu yang luar biasa(?)
File config digunakan untuk mendefinisikan fungsi untuk membaca file .env secara langsung, tanpa menggunakan paket tambahan.
worker - Ini adalah tempat di mana logika utama berada, yang menggunakan logika api dan db secara tepat untuk menghasilkan perilaku yang diinginkan. Jika jenis worker bertambah di masa mendatang, folder ini juga harus bertambah. Saat ini, hanya ada satu perilaku worker utama yang disertakan.
Di masa mendatang, saya berencana untuk terus mengembangkan kode sambil menjaga prinsip arsitektur berlapis.
Dependensi Proyek
pq untuk penggunaan postgres
sqlx untuk penggunaan query
Menutup Worker
Hanya menyajikan teori tanpa kode terasa membosankan, dan saya juga merasa sedikit lelah. Jadi saya akan mengakhirinya dengan cepat.
Bagian 2 telah berakhir. Saya berharap dapat menyertakan lebih banyak kode dan membahasnya di Bagian 3.
Selama pengembangan Leginote, jika Anda memiliki fitur yang menurut Anda diperlukan atau memiliki pertanyaan tentang pengembangan, silakan tinggalkan komentar!