2010-10-27 15 views
10

Ho una startup che considera la costruzione di un backend Java e un frontend di Rails. Il back-end Java si occuperà di creare un livello di memorizzazione nella cache per il database e offrire altri servizi aggiuntivi. Il frontend di Rails sarà principalmente per la creazione di webapp e strumenti di monitoraggio.Java Backend e Rails Frontend

Quali startup/aziende utilizzano questo tipo di installazione? Quali sono alcuni trucchi in termini di velocità di sviluppo, implementazione, scalabilità e integrazione?

(Che cosa sarebbe utile per me è l'esperienza personale o casi di studio informali. Mi piacerebbe de-priorità risposte indirizzamento alternative come Grails o JRuby a meno che non si rivela essere una grande parte dell'equazione)

Grazie!

+0

Cosa ti aspetti di essere nel back-end e come dovrebbe comunicare il frontend con il backend? –

+0

@Thorbjorn: Per quanto riguarda la comunicazione, mi sto appoggiando a JSON. Anche se non sono convinto della libreria da utilizzare o dei compromessi di accompagnamento come la manutenzione. Pensieri? – Ian

+0

TWitter sta facendo questo. Il loro frontend è Rails e il loro backend sta usando Scala. Penso che tu stia facendo la cosa giusta: usare lo strumento giusto per il lavoro giusto. –

risposta

2

Forse sto affermando l'ovvio qui, ma il più grande trambusto qui è il fatto reale che stai combinando due tecnologie. Non solo lo sviluppo sarà più lento - Rails e tutti i framework Java si aspettano di avere un'applicazione Ruby/Java completa - ma per gli altri problemi menzionati (implementazione, scalabilità, integrazione), gli strumenti e le soluzioni esistenti non funzioneranno, o almeno non molto bene.

Se si dispone di un motivo valido per combinare i due, andare avanti, ma si aspettano di trascorrere più tempo su questi temi rispetto a una soluzione con una sola tecnologia. Se non lo fai, scegli Rails o Java.

+1

Potrebbe essere ovvio, ma aiuta a darti un'enfasi in più, grazie. Il mio pensiero è che ogni lingua è probabilmente migliore per svolgere determinati compiti rispetto agli altri. Ad esempio, almeno personalmente, Rails è molto più veloce nella prototipazione di una webapp. Come quantificare/qualificare il tradeoff come quello tra il tempo guadagnato lì e il tempo perso con l'implementazione, la scalabilità e l'integrazione. – Ian

+0

@Jeroen: non sono d'accordo con quello che hai affermato. È una decisione arquitectural. Non posso dire di Rails, ma i framework Java NON si aspettano un'applicazione Java completa. Questo è completamente l'oposite che vediamo al giorno d'oggi. Non esiste una pallottola d'argento e dobbiamo scegliere la tecnologia che meglio risponde a ogni problema. Se stai creando una grande applicazione SOA, questa chiara separazione delle preoccupazioni è forse la strada da percorrere (Twitter per esempio). – Trein

4

Ho usato una coppia simile per uno dei miei progetti, ma invece di RoR ho usato Python. Non penso che ci sia una grande differenza.

In generale, non c'è nulla di specifico in questo tipo di programmazione. Due cose più importanti di cui ti devi preoccupare:

  • buona modularità;
  • protocollo ben congegnato tra RoR e Java.

Il primo riguarda la scomposizione della funzionalità esatta tra parti del sistema. Abbiamo alcuni problemi a causa della mancata comprensione di quale parte di un lavoro deve essere eseguita da Java e quale parte di Python. In generale, devi unire tutte le funzioni che sono vicine l'una all'altra e le cose che sono lontane devono essere collegate in pochissimi posti. Immagino che tu conosca regole di buona modularità, ma in caso di composizione di lingue diverse questo deve essere pensato molto più attentamente. Puoi anche essere interessato a creare diversi servizi Java distinti (ad esempio uno per il caching del database e un altro per tutto il resto) per poterli combinare liberamente o persino utilizzarli in altri progetti in seguito.

Il secondo riguarda la comunicazione tra le parti. Riesco a vedere due modi di comunicare: attraverso il database e il puro protocollo di rete. I primi necessitano comunque di alcune comunicazioni di rete, quindi abbiamo utilizzato il protocollo di rete puro, senza alcun altro modo per collegare le parti.
Abbiamo sperimentato molto con SOAP, ma ha dato centinaia di errori: questo protocollo è abbastanza adatto per connettere servizi scritti in una lingua (id Java a Java), ma terribile per la connessione di servizi in lingue diverse - strumenti automatici per generare WSDL ha dato risultati diversi per Java e Python e la creazione manuale dello schema era difficile e laboriosa.
Quindi eravamo abituati a REST. Usa tutte le funzionalità del protocollo HTTP come tutti e quattro i principali metodi HTTP (POST, GET, PUT, DELETE), i codici di errore e molte altre cose, quindi copre quasi tutto ciò che si può desiderare. L'unica restrizione con REST è che non può contenere lo stato, quindi potrebbe essere necessario implementare il proprio meccanismo di sessioni.
Se non si è molto a proprio agio con REST e si cerca un esempio reale, vedere Facebook Graph API e per implementare i servizi REST in Java è possibile utilizzare Restlets.

+0

Grande commento su modularità e comunicazione, grazie. Hai preso una decisione consapevole di utilizzare REST su alternative JSON? Se è così, quale era il tuo pensiero? – Ian

+0

Intendi perché abbiamo usato REST _instead of_ JSON? Non l'abbiamo fatto. REST è solo un'architettura, è possibile utilizzare qualsiasi rappresentazione per trasferire i dati. Abbiamo dovuto usare XML (avevamo bisogno di rendere il nostro servizio disponibile per un altro team di sviluppatori), ma in generale è buona norma utilizzare il modello REST con JSON come rappresentazione principale. Ad esempio, per lavorare con la tabella 'Foo' in DB make url'/foo/ ', usa il metodo' PUT' per aggiungere una nuova istanza 'Foo',' POST' per aggiornare, 'DELETE' per rimuovere e' GET' per recuperare - questo è REST. E i dati effettivi su tutti questi URL possono essere rappresentati come stringhe JSON. Leggi alcune informazioni su REST;) – ffriend

+0

E ancora, vedi Facebook Graph API: utilizzano l'architettura REST e oggetti rappresentati da JSON. – ffriend

2

Vi esorto vivamente a considerare di avere il frontend e il backend nella stessa JVM per motivi di prestazioni.

Per Rails, JRuby può eseguire Rails e lo si può avere in un contenitore Java EE che fornisce una comunicazione veloce tra i componenti.

Avere più architectures che non vengono eseguiti nello stesso processo richiede una comunicazione basata sulla rete che richiede molto, molto più tempo del semplice passaggio di un riferimento a un oggetto (non mi aspetto che tu voglia utilizzare la memoria condivisa).

+0

La comunicazione e il successo della performance associata sono sicuramente una grande parte della decisione. Come faccio a qualificare/quantificare questo impatto sul rendimento? Una webapp ha già chiamate di rete a cose come memcached e, forse, solr. Non mi è stato notabile l'impatto sul rendimento. Sarà diverso per effettuare chiamate ad altri servizi Java? – Ian

+0

Per quanto riguarda JRuby, sto vedendo che l'integrazione con Spring 3 non è troppo semplice da guardare la documentazione. Inoltre, il supporto della comunità come i plugin per JRuby non è così dettagliato. Niente che possa quantificare, ma solo una sensazione. Hai esperienze con questo? – Ian

+0

ørn Ravn Anderse: ogni volta che selezioni i dati dal DB, fai comunicazione in rete, pensaci. Sì, è più lento quindi passare un riferimento, ma non così in modo cruciale. – ffriend

6

Non ho mai fatto nessuno sviluppo di binari ma qui sono i miei pensieri. Perché non usare solo Grails? Ho fatto una buona parte dello sviluppo di Grails e funziona bene per la prototipazione rapida. Offre anche tutta la potenza di Java, Spring e Hibernate. Invece di occuparsi della comunicazione tra due diverse tecnologie, si potrebbe approfittare del fatto che Grails utilizza Spring e Hibernate sotto le copertine per gestire il caching e tutti gli altri requisiti supportati da queste tecnologie. Se hai sviluppatori Java, Grails non dovrebbe essere difficile da raccogliere. La storia del plugin Grails è decente. Tutti sono archiviati in un posto centrale e sono facili da ottenere ma la qualità varia a seconda dell'autore del plugin. Bisogna anche ricordare che poiché Grails usa Groovy che è sintatticamente simile a Java e gira su JVM, è molto facile usare il codice java esistente, compresa la moltitudine di librerie Java disponibili. Non lo so per certo ma presumo ci siano molte più librerie disponibili per Java e lì con Grails sono disponibili per il linguaggio Ruby e Rails. Non posso fare una richiesta di utilizzo delle risorse per te, ma la mia domanda sarebbe quante persone hai con esperienza progettando sistemi Rails che usano Java sul back-end con tutti i trucchi che andranno insieme a quello? Potresti scoprire di non avere nessuno esperto nel debugging quando qualcosa va storto nella comunicazione tra le due tecnologie.

+0

I graal hanno sicuramente un senso come alternativa. È più un dilemma delle risorse umane per me a quel punto. Abbiamo alcuni esperti di Java e alcuni esperti di Rails. L'uso di Grails potrebbe far accelerare entrambe le parti. Almeno su entrambi i lati, alcune persone conosceranno i piccoli trucchi piuttosto che avere tutti in un nuovo territorio. La soluzione ha perfettamente senso. Non mi sono mai convinto del compromesso. Pensieri? – Ian

+0

Un altro aspetto di cui non ho abbastanza esperienza per effettuare una chiamata è il supporto plugin/gem per Grails. Quale percentuale di plugin/gemme che posso trovare su Rails sarò anche in grado di trovare in Grails? In parole povere, naturalmente. – Ian

+0

@lan, quale percentuale dei plugin Rails sono ancora compatibili con l'ultima versione di Rails? quasi nessuno ... – Kedare

1

Twitter.com utilizza presumibilmente un backend Java e Rails per la loro interfaccia web. Ecco alcune risorse:

http://www.radicalbehavior.com/5-question-interview-with-twitter-developer-alex-payne/

http://blog.adsdevshop.com/2008/05/02/twitter-is-not-abandoning-rails/

http://twitter.com/#!/ev/status/801530348

Più in particolare, usano Scala il backend (che viene compilato in bytecode Java):

http://www.artima.com/scalazine/articles/twitter_on_scala.html

Non penso che ci sia qualcosa di sbagliato in questo appro ach. Tuttavia, supporterai due diverse piattaforme/VM. Ho visto questo tipo di risultati in una sorta di fratturazione delle competenze all'interno di un'organizzazione. E finisci per pagare molto per avere due set di competenze in casa.

Se il problema della segmentazione delle competenze ti riguarda, ti suggerisco di eseguire JRuby di Rails. Ora è molto maturo e funziona meglio di Rails su Ruby 1.8.x.

1

Abbiamo usato Ruby on Rails per front-end e Core-Java SOAP Api per back-end. Ha funzionato molto bene.

Il problema principale non riguarda le prestazioni, ma le persone. È molto difficile assumere persone esperte in Ruby on Rails per tutto, invece ne assumi pochi o puoi facilmente modellarti per imparare solo l'interfaccia utente di Rails.

Come punto di partenza, è la migliore strategia. Molti credono che ROR sia la cosa migliore per le startup ... ma pochi lo sapevano perché nella maggior parte delle MNC usiamo Java, quindi c'è bisogno di imparare Rails e Code, o assumere pochissimi sviluppatori ROR. Quindi, invece, è possibile utilizzare ROR per frontend (solo poche persone lo fanno, o è facile da apprendere) e utilizzare esperti sviluppatori Java per aggiornamenti DB e business logic.

Problemi correlati