Un'API del servizio dati è una buona idea?

6

Al momento disponiamo di un'applicazione monolitica Rails che è in realtà composta da tre applicazioni separate che utilizzano gli stessi dati. Nel tentativo di capire come compartimentare e rompere correttamente la mono-app in parti più piccole, sembra evidente che abbiamo bisogno di un servizio dati centrale con cui i vari pezzi possano comunicare, perché non voglio dover ridefinire un strato di modello per ogni applicazione e / o modello di copia tra le varie applicazioni (DRY). L'idea è che, poiché il database / persistenza (inclusi concetti come le convalide) saranno gli stessi per ciascun componente, sarebbe logico disporre di un servizio che può essere utilizzato per richiedere dati e creare / aggiornare / eliminare.

Quello che sto immaginando è essenzialmente un'API JSON che si trova tra il database e il mio livello di applicazione. L'API non sarà immediatamente esposta al "mondo esterno" (anche se potrebbe essere qualcosa che si verifica in futuro); per ora, sarebbe semplicemente comunicato con internamente (cioè da / verso una app Rails (o altro) pubblica). Questa API sarebbe essenzialmente solo una logica di persistenza astratta.

  1. È una buona idea? Ci sono delle insidie a cui non sto pensando?
  2. Se questa è una buona idea, qualcuno sa di un ORM di Rails o di una gemma che può essere usata per coordinare questo tipo di impresa? La mia visione è che una volta che un servizio dati è in esecuzione, l'effettiva applicazione Rails non utilizzerà più ActiveRecord, ma piuttosto qualcosa che gestirà l'interrogazione dell'API dei dati.
posta Daniel Vandersluis 10.06.2013 - 23:26
fonte

2 risposte

5

Sì, questa è un'ottima idea. L'utilizzo di un set centrale di servizi Web consente di evitare duplicazioni e incoerenze delle funzionalità; rende i servizi Web il sistema di registrazione per tutte le applicazioni dell'utente, e possono essere coperti da una serie di test automatici omogenei, piuttosto che cercare di mettere insieme una suite di molti tipi di test. Non sono sicuro di quale sia l'approccio migliore per la creazione di questi servizi Web, in Ruby; Sinatra può sicuramente farlo. Ho lavorato personalmente con Pyramid e Django , nell'ecosistema Python, ed è stato molto più felice con Pyramid. Java, naturalmente, ha molti framework per i servizi RESTful; Jersey è l'implementazione di riferimento dello standard pertinente.

Per Rails, non sono sicuro che ci sia una buona libreria per adattare gli oggetti ORM ai servizi RESTful, sfortunatamente; è probabile che creerai query personalizzate nei tuoi servizi web, in una certa misura, e ciò complica l'automazione necessaria per rendere la "magia" di un ORM funzionante. Detto questo, potresti essere sorpreso di quanto le tue query siano semplificate quando puoi letteralmente chiedere una rappresentazione specifica dell'oggetto business; molti join e concetti correlati sono irrilevanti e si può probabilmente cavarsela con una semplice classe che segue i collegamenti all'interno del corpo della risposta per recuperare altre risorse che sono state esposte tramite ipertesto ( hateoas ).

    
risposta data 11.06.2013 - 00:38
fonte
3

Per rispondere alle tue domande:

1) Sì, è una grande idea per le buone ragioni citate da @syrion. Stai davvero parlando di adottare un approccio orientato ai servizi ( buzzword warning ). Se la vedi in questo modo, potresti voler ampliare l'ambito dei tuoi servizi oltre le operazioni CRUD e includere la logica di business che puoi utilizzare nelle tue applicazioni (è difficile dare un esempio specifico senza saperne di più sulla tua app). Un ottimo trattamento di questo argomento, incluse le opzioni Rack e Sinatra, è Progettazione orientata ai servizi con Ruby e Rails di Paul Dix.

2) Ci sono alcuni modi per gestirlo dalla prospettiva delle app Rails che consumano i servizi. In una situazione simile ho scritto la mia gemma come SDK per i miei servizi. Internamente ho usato HTTParty per comunicare con i servizi. Potresti anche voler controllare ActiveModel come sostituto di ActiveRecord in questa situazione.

    
risposta data 14.08.2013 - 00:09
fonte

Leggi altre domande sui tag