Il posto giusto per incorporare un parser: server o client?

2

Sto scrivendo un software di gestione del database. Ha un'architettura client-server in cui il server ha il pezzo di codice da memorizzare e recuperare. Il client deve ottenere l'input dall'utente, si connette al server e lo interroga. Ora ho un parser in grado di analizzare query come SQL. La mia domanda è qual è il posto migliore per incorporare questo parser?

Opzione 1 - Incorporamento nel server:

Ottieni le query dal client, passane intatto sul server e poi analizzalo e fai il necessario.

(OR)

Opzione 2: incorporamento nel client:

Recupera le query dal client, analizzala poi e lì e quindi passa un oggetto comando che ha campi specifici impostati che riflettono le query sul server e che il server agisce sui dati nell'oggetto comando.

Qual è il modo giusto di fare?

    
posta Lakshmi Narayanan 26.08.2013 - 11:51
fonte

4 risposte

2

Dipende. Se è necessario interrogare il server per ottenere molti metadati per eseguire l'analisi, l'analisi sul client può causare molti roundtrip aggiuntivi (aggiuntivi a quelli per l'esecuzione della query stessa). D'altra parte, se il client può analizzare la query e fare un controllo della sintassi in anticipo, senza parlare al server, potrebbe essere necessario meno roundtrips rispetto a quando è necessario chiedere al server prima di verificare se la query fosse sintatticamente corretta.

Un'altra domanda è se il parser ha bisogno di molto tempo per la CPU; questo sarebbe un motivo per posizionarlo sul client, per evitare di strozzare il server.

E una terza cosa da considerare è la facilità con cui si usa il parser sul client o sul server, il che può dipendere in una certa misura dai linguaggi di programmazione che si stanno utilizzando e da come si fa effettivamente l'incorporamento. Immagino che questo non sia un problema nel tuo caso (dato che è così ovvio che altrimenti lo avresti menzionato)

    
risposta data 26.08.2013 - 15:23
fonte
3

Non esiste una risposta giusta. Dipende da cosa vuoi fare.

Se ho capito bene, stai creando un sistema che consente agli utenti di creare query SQL e inviarle al tuo server DBMS.

Se si può fare affidamento sugli utenti per non inviare comandi "CANCELLA DA TABELLA" malevoli, allora entrambe le opzioni funzionerebbero. Se si hanno utenti non fidati, si ha un sacco di azione disinfettante da fare prima di inviare la query al database. il sanitizzante deve essere eseguito sul server.

Altre preoccupazioni sono state menzionate nei commenti, come il numero di diversi sistemi operativi su cui il client deve essere eseguito.

In generale, il tuo cliente non è affidabile e il tuo server è affidabile. Generalmente, si mette quanto più possibile sul server, principalmente per ragioni di sicurezza, in qualche modo per motivi di coerenza. Le prestazioni ne risentiranno.

Se le migliori prestazioni sono la tua preoccupazione principale, allora metti il maggior numero di elaborazioni possibili sul client. Ciò consente di servire la maggior parte dei client con un determinato server. Tuttavia, la sicurezza e la coerenza ne risentiranno.

    
risposta data 26.08.2013 - 15:19
fonte
1

Non esiste una risposta giusta, ma tieni presente che:

  • Il client non deve essere considerato affidabile. In qualsiasi contesto, anche se leggermente correlato alla sicurezza, il client o la comunicazione di rete sono solitamente facili da attaccare. Quindi il server non deve mai fidarsi del client ma deve sempre validare tutto.
  • Sulla rete i dati sono sempre serializzati in qualche modo, quindi il server ha bisogno di qualche tipo di parser. Potrebbe essere molto più semplice di quello di analizzare l'input originale, ma è ancora un parser.
risposta data 27.08.2013 - 09:24
fonte
0

Aggiungendo ad alcuni dei buoni criteri già indicati, come

  1. Viaggi di andata e ritorno. Mettere l'analisi sul client può rendere l'interazione molto più reattiva. Se gli utenti commettono un semplice errore di sintassi, il feedback, attraverso l'evidenziazione della sintassi, può essere istantaneo.
  2. Sicurezza. Consentire a un client non protetto su un canale di comunicazione non sicuro di inviare un costrutto ricco come un oggetto comando che verrà eseguito senza ulteriori verifiche sul server può essere rischioso. Sì, puoi controllare l'oggetto comando sul server, ma hai lo stesso codice in due punti. Non ideale.

e

Salvo altre preoccupazioni prioritarie, il mio criterio principale per questo problema è la scelta del linguaggio. Trovo gli ordini di grandezza più veloci e privi di errori per implementare la logica di analisi o altra logica complessa in un linguaggio solido e chiaro, come quelli supportati sulle piattaforme server heavy-duty. Ad esempio, implementando l'analisi in JavaScript, cercando di tracciare un linguaggio che si rifiuta di darmi anche un errore del compilatore, se accidentalmente ho un refuso nel mio nome variabile, e invece, dichiara un'altra variabile !, contro C #.

    
risposta data 26.08.2013 - 15:37
fonte

Leggi altre domande sui tag