- LegiNote Progetto di Sviluppo - Storia 1 - Idea
- StatPan ha avviato il progetto LegiNote con l'obiettivo di migliorare l'accessibilità alle leggi e ai verbali parlamentari e di aumentare l'efficienza legislativa tramite l'intelligenza artificiale.
Testo tradotto dall'IA.
Riepilogo del post generato dall'IA di durumis
- Il progetto LegiNote utilizza Svelte, Rust, Go e Python per lo sviluppo di servizi web, in particolare il worker sviluppato in Go svolge il ruolo di raccolta e aggiornamento dei dati OpenAPI.
- Il worker svolge funzioni come l'impostazione della logica di raccolta dati, l'esecuzione e il caricamento nel DB, mirando all'estensibilità a vari dati API.
- Il progetto è strutturato in modo da minimizzare le dipendenze, separando le cartelle in base alle funzionalità e utilizza PostgreSQL, pq e sqlx per la connessione al database e l'elaborazione delle query.
Ciao, sono StatPan.
Sto scrivendo sulla cronaca dello sviluppo del progetto secondario LegiNote.
Per la parte precedente, si prega di fare riferimento al seguente link.
Architettura di base
Design Leginote sponsorizzato da TaeYangTokki
Leginote è progettato per essere sviluppato principalmente come servizio web e prevede di utilizzare il seguente stack tecnologico.
Frontend: Svelte
Backend: Rust (si sta considerando seriamente rupring, ma potrebbe cambiare)
Worker: Go (si punta all'utilizzo estremo di std, ad eccezione delle dipendenze essenziali)
Analisi dei dati: Python (dalla pre-elaborazione all'integrazione futura dell'intelligenza artificiale)
Tra gli stack sopra menzionati, ho intenzione di serializzare gli articoli del blog focalizzandomi sullo sviluppo delle sezioni Worker e Analisi dei dati, che sono le aree in cui contribuisco maggiormente.
Iniziamo parlando del Worker.
Worker
Scelta del linguaggio
logo golang
Ho iniziato a programmare con Python e, dato che il mio lavoro principale è nel campo della data science, sono più familiare con il linguaggio Python. Tuttavia, conoscendo solo i linguaggi di scripting, ho iniziato a desiderare un solido linguaggio compilato e ho iniziato a interessarmi ai linguaggi Go e Rust.
In particolare, il linguaggio che ho seguito con maggiore interesse di recente è stato Rust, e quando Rust viene menzionato, di solito viene menzionato insieme a C++ e Golang. (Naturalmente, C++ è un ottimo linguaggio, ma l'ho escluso nello sviluppo di servizi di rete come questo. Non sono sicuro se lo userò direttamente in futuro, a meno che non mi occupi di framework di deep learning interni.)
Ho imparato Rust e Golang e li ho usati per semplici richieste di rete, permettendomi di capire brevemente i punti di forza e di debolezza di Rust e Golang. In questo articolo, sarebbe troppo lungo discutere i pro e i contro dei due, quindi penso che sarebbe meglio riassumerli separatamente in un altro articolo. Per riassumere brevemente,
Nel campo della rete, è possibile configurare senza dipendenze aggiuntive e, dato che si tratta di un progetto sconosciuto in cui non si sa se si genererà reddito,Golangè stato scelto come linguaggio.
Ruolo del Worker
Schermata OpenAPI
Il ruolo del Worker è raccogliere e aggiornare i dati tramite il sito OpenAPI ogni ciclo, e può essere suddiviso in tre parti:
1. Impostazione della logica di raccolta per informazioni specifiche
2. Impostazione di un eseguitore che esegue la logica di raccolta
3. Caricamento dei dati raccolti nel database
L'obiettivo è espandere applicando la stessa procedura dei tre punti sopra a vari dati API.
Piano di struttura del progetto
Esistono diverse architetture per la struttura di un progetto, e l'utilizzo di un framework consente di iniziare con una struttura già definita. Tuttavia, come accennato in precedenza, l'obiettivo di questo progetto è sviluppare con un numero minimo di dipendenze, quindi ho cercato di separare le cartelle in base alle funzioni, il più vicino possibile alla logica definita sopra.
Il progetto sarà strutturato come segue.
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 - La raccolta dei dati viene effettuata tramite OpenAPI dei dati pubblici. Pertanto, il codice di base per la comunicazione con OpenAPI verrà inserito nella cartella api. Attualmente, poiché solo un'API viene utilizzata principalmente, è composta da un solo file client.
db - La logica per la comunicazione con il database è definita qui. Il codice all'interno di connection gestisce solo la connessione, mentre repository contiene la logica per l'esecuzione di vari SQL upsert. Poiché avere lo stesso SQL nel codice è troppo complesso, ho intenzione di creare un file separato per lo SQL in futuro.
util - Qui sono definite varie logiche di supporto per le attività. error è uno script temporaneo creato per gestire facilmente i risultati degli errori restituiti da Go. Come vedremo più avanti nella cronaca dello sviluppo, questo crea un enorme effetto farfalla (?)
Il file config è un file che definisce direttamente la funzione per la lettura dei file .env, poiché non si utilizza un pacchetto separato per la lettura dei file .env.
worker - Contiene la logica principale per realizzare le funzionalità desiderate utilizzando le logiche api e db in modo appropriato. Se in futuro il numero di worker dovesse aumentare, anche questa sezione dovrebbe aumentare di conseguenza. Per ora, contiene solo il funzionamento di un worker principale.
In futuro, ho intenzione di far evolvere il codice mantenendo i principi dell'architettura a strati.
Dipendenze del progetto
pq per l'utilizzo di postgres
sqlx per l'utilizzo di query
Conclusione del Worker
Credo che elencare solo la teoria senza codice possa essere noioso, e anche io mi sento un po' annoiato, quindi penso che starò concludendo abbastanza rapidamente.
La parte 2 è già finita. Spero di poter includere più codice e discutere di più dalla parte 3 in poi.
Durante lo sviluppo di Leginote, se ci sono funzionalità che ritieni necessarie o se hai domande sullo sviluppo, non esitare a lasciare un commento!