Arsitektur
Mengisolasi CGO di sidecar agar backend desktop Go tetap portabel
Cara Laras menjaga API Go-nya bebas CGO dengan memindahkan pengenalan suara offline ke proses sidecar terpisah, dan keuntungannya saat build.
Oleh Naufal Hilmi Abdurrahman · Terbit
Laras adalah aplikasi desktop dengan backend Go yang berjalan secara lokal. Dua kebutuhannya menarik ke arah yang berlawanan. Ia membutuhkan basis data dan membutuhkan pengenalan suara offline. Salah satunya bisa murni Go. Yang lain tidak.
Masalah dengan satu biner
Rancangan yang paling jelas adalah satu server Go yang membuka SQLite dan memanggil pengenal suara secara langsung. Masalahnya ada pada dampaknya terhadap proses build.
Driver SQLite yang umum untuk Go membungkus pustaka C, dan Vosk adalah pustaka C++ dengan binding Go. Keduanya berarti CGO. Begitu CGO aktif, kompilasi silang tidak lagi sekadar mengatur GOOS dan GOARCH. Setiap target membutuhkan toolchain C yang sesuai, build Windows harus memakai keluarga kompiler yang sama dengan yang dipakai membangun pustaka suara, dan image CI membengkak untuk membawa semuanya.
Biaya itu akan ditanggung seluruh backend, termasuk sebagian besar bagiannya yang hanya menangani permintaan biasa dan tidak ada hubungannya dengan audio.
Pisahkan di dependensinya, bukan di fiturnya
Laras menarik garis tepat di tempat dependensi native berada.
Server API bebas CGO. Ia memakai modernc.org/sqlite, terjemahan SQLite ke Go murni, lewat antarmuka standar database/sql. Autentikasi, materi, progres, kuis, dan lainnya dikompilasi hanya dengan toolchain Go.
Suara adalah biner kedua. Pengenal suara dibangun sebagai program kecil tersendiri dengan CGO aktif dan pustaka Vosk tertaut. Tauri menjalankan kedua program sebagai sidecar di samping jendela aplikasi.
Server utama memperlakukan suara sebagai sesuatu yang ia minta, bukan sesuatu yang ia kandung.
Apa yang didapat
- Build yang umum jadi sederhana. Menjalankan backend atau pengujiannya hanya membutuhkan Go. Tanpa unduhan model, tanpa penyiapan kompiler.
- Aturan toolchain berlaku di satu tempat. Keharusan mencocokkan toolchain MinGW di Windows memang nyata, tetapi terbatas pada satu biner dengan tugas yang sempit.
- Kegagalan dapat dilokalisasi. Masalah di kode suara native adalah masalah di proses terpisah, bukan crash di server yang memegang akun dan progres.
- Sambungannya dapat dipakai ulang. Karena server sudah berbicara dengan suara melintasi batas proses, mengganti mesinnya adalah perubahan pada satu program.
Apa harganya
Kini ada dua artefak untuk dibangun, ditandatangani, dan dikirim, serta batas proses yang harus dilintasi di setiap permintaan pengenalan. Untuk suara, overhead itu tidak berarti: pelajar berbicara selama beberapa detik, dan beberapa milidetik komunikasi antarproses lokal tidak terasa dibandingkan itu.
Ceritanya berbeda untuk sesuatu yang dipanggil ribuan kali per detik. Ini adalah pola untuk pekerjaan native yang berat dan jarang, bukan aturan umum.
Kapan memakainya
Pilih sidecar ketika dependensi native hanya dibutuhkan satu fitur, ketika dependensi itu merumitkan build untuk bagian lainnya, dan ketika pemanggilannya cukup kasar sehingga satu lompatan proses terasa murah. Jika ketiganya terpenuhi, mengisolasinya membuat sisa basis kode tetap membosankan, dan itulah yang Anda inginkan dari bagian yang mengurus akun dan data.
Arsitektur lengkapnya dijelaskan di halaman proyek Laras.