Come architettura ed esporre un'API per la creazione di filtri dati personalizzati?

2

Questa domanda è nel contesto di un'applicazione server - un'API che alimenta i dati ai suoi clienti.

Ecco l'ovvio: se ho alcuni dati, posso cercare e filtrare su quei dati, tuttavia, per favore. Diciamo che ho alcuni dati con la seguente struttura di base:

[
  {
    name: 'Paul';
    location: [51.6689134, -0.15818313],
    age: 29,
    gender: m,
  },
  {
    name: 'Emma';
    location: [52.53499242, 0.75317249],
    age: 34,
    gender: f,
  },
  {
    name: 'James';
    location: [50.8162756, -3.08500886],
    age: 27,
    gender: m,
  },
  {
    name: 'Alison';
    location: [48.80648622, -0.60906778],
    age: 41,
    gender: f,
  },
  ...
]

Dato che sono il proprietario del codice lato server, posso implementare le opzioni di filtro nella mia API in base a uno qualsiasi di questi campi, ad esempio per recuperare solo le donne, o sopra gli anni '40, o qualsiasi altra cosa, nessun problema.

Tuttavia, ecco la sfida: come posso esporre un'API per consentire agli sviluppatori di creare filtri personalizzati usando i miei dati? Ad esempio, qualcuno potrebbe voler creare un filtro per recuperare solo record di persone il cui nome è lungo esattamente 4 caratteri, o la cui posizione si trova entro un raggio di 1 miglio del punto X - in pratica, tutto va bene. Non saprò che tipo di filtri creativi verranno creati dalla gente. Dato che mi aspetto che questi filtri vengano creati dagli sviluppatori, la loro implementazione potrebbe richiedere un po 'di programmazione. Tuttavia, loro (o I) devono essere in grado di rendere pubblici questi filtri in modo che anche gli utenti medi possano utilizzarli - proprio come un sistema di plugin.

Ecco uno scenario di esempio per aiutare con la descrizione precedente:

  1. Ho una directory di persone, con la struttura dei dati sopra.
  2. Ho un sito web in cui le persone possono cercare i miei dati in base ad alcuni filtri di base che offro immediatamente.
  3. Espongo un'API, che consente agli sviluppatori di creare i propri filtri personalizzati.
  4. Uno sviluppatore utilizza la mia API per implementare un filtro per abbinare record di persone in cui il nome della persona è N caratteri (N essendo un parametro)
  5. Un utente normale viene sul mio sito Web e utilizza il filtro personalizzato creato dallo sviluppatore per cercare persone il cui nome è lungo esattamente 4 caratteri.

EDIT 1: i filtri personalizzati possono avere dipendenze esterne, ad es. potrebbe essere necessario utilizzare un'API esterna per determinare l'origine di un nome, al fine di trovare persone con nomi italiani.

Due cose importanti:

  1. Prestazioni ed efficienza del sistema
  2. Facilità d'uso per gli utenti regolari

Da un punto di vista architettonico, come implementeresti un simile sistema?

MODIFICA 2

Capisco che questa non è una sfida banale, e che potrebbe non esserci nemmeno una soluzione, a causa di limitazioni tecniche. Tuttavia, credo anche che potrebbe esserci una soluzione intelligente in agguato nell'ombra.

Giusto per chiarire, il set di dati può avere un massimo di 2-3 milioni di record (e sarebbe bello consentire i filtri personalizzati a quel livello), ma se necessario, penso che sarò in grado di ridurre il set di dati ricercabili significativamente fino ad un massimo di circa 1000 voci, prima di colpire qualsiasi filtro personalizzato.

    
posta Merott 06.02.2017 - 15:33
fonte

1 risposta

2

Se ci pensate, tutti questi dati consistono (al livello più basso) di alcuni tipi primitivi standard (ad esempio, la posizione è solo un insieme di due doppi con un significato arbitrario).

Vorrei andare con la definizione di set di operatori per ciascuno di quei tipi. Uguale, minore di, maggiore di, non compreso nell'intervallo e così via. Per il tipo stringa vorrei aggiungere anche l'operatore regexp (che soddisferebbe i requisiti lunghi e simili di n-char). Sono necessari anche il raggruppamento e gli operatori logici.

Questo dovrebbe essere sufficiente per la maggior parte dei casi. Naturalmente non sarebbe possibile fare calcoli più complessi (ad esempio la distanza di levenshtein) ma è possibile aggiungerli come operatori se e quando gli utenti ne hanno bisogno (ricordati che possono fare ulteriori calcoli al loro fianco con i dati raccolti dalla tua API che è perfettamente bene).

Oltre a questo, scrivere sandbox di buona qualità per l'esecuzione di codice estraneo e non affidabile all'interno del dominio dell'applicazione. Quindi i tuoi sviluppatori possono eseguire qualsiasi codice che desiderano su quei dati. E qui è il problema principale: come sandbox quel codice per essere innocuo.

Si può andare con la cancellazione di tutto il codice dato da cose "cattive" (qualcosa come la whitelist dei metodi) ma questo è un sacco di lavoro e si troveranno sempre buchi di sicurezza.

Un'altra opzione è quella di introdurre il proprio linguaggio completo di Turing che verrà compilato al tuo fianco per indirizzare il codice di esecuzione. Molto lavoro per te e per gli utenti (hanno bisogno di impararlo).

La cosa più semplice da fare è lasciare che gli sviluppatori eseguano il codice nativo, ma introducono il processo di revisione: ti inviano il codice sorgente della routine, lo rivedi e se è innocuo, includilo nei filtri.

    
risposta data 07.02.2017 - 03:23
fonte