2010-10-27 14 views
10

Ich habe ein Startup erwägt, ein Java-Backend und ein Rails-Frontend aufzubauen. Das Java-Backend kümmert sich um die Erstellung eines Cache-Layers für die Datenbank und bietet weitere zusätzliche Dienste an. Das Rails-Frontend dient hauptsächlich zur Erstellung der Webapp- und Monitoring-Tools.Java Backend und Rails Frontend

Welche Startups/Firmen verwenden diese Art von Setup? Was sind die Herausforderungen in Bezug auf Entwicklungsgeschwindigkeit, Bereitstellung, Skalierbarkeit und Integration?

(Was für mich hilfreich wäre persönlicher Erfahrung oder informeller Fallstudien ist. Ich möchte de-Prioritäten Antworten Alternativen wie Grails oder JRuby Adressierung es sei denn, es ist ein großer Teil der Gleichung erweist)

Danke!

+0

Was würden Sie erwarten, im Backend zu sein, und wie sollte das Frontend mit dem Backend kommunizieren? –

+0

@Thorbjorn: Soweit Kommunikation, ich lehne mich an JSON. Obwohl ich nicht überzeugt bin, welche Bibliothek zu verwenden oder die damit verbundenen Kompromisse wie Wartung. Gedanken? – Ian

+0

TWitter tut dies. Ihr Frontend ist Rails und ihr Backend benutzt Scala. Ich denke, Sie tun das Richtige: das richtige Werkzeug für den richtigen Job zu verwenden. –

Antwort

2

Vielleicht behaupte ich das Offensichtliche hier, aber das größte Problem hier ist die Tatsache, dass Sie zwei Technologien kombinieren. Die Entwicklung wird nicht nur langsamer - Rails und alle Java-Frameworks erwarten eine vollständige Ruby/Java-Anwendung - aber für die anderen von Ihnen genannten Probleme (Bereitstellung, Skalierbarkeit, Integration) werden die vorhandenen Tools und Lösungen nicht oder zumindest nicht funktionieren nicht sehr gut.

Wenn Sie einen zwingenden Grund haben, die beiden zu kombinieren, gehen Sie voran, aber erwarten Sie, dass Sie mehr Zeit mit diesen Problemen verbringen als mit einer einzelnen Technologielösung. Wenn Sie dies nicht tun, wählen Sie entweder Rails oder Java.

+1

Könnte offensichtlich sein, aber es hilft Ihnen, dass Sie ihm eine zusätzliche Betonung geben, danke. Mein Denken ist, dass jede Sprache ist wahrscheinlich besser bei der Durchführung bestimmter Aufgaben als die andere. Rails ist zum Beispiel persönlich viel schneller beim Prototyping einer Webapp. Wie quantifiziere/qualifiziere ich den Tradeoff zwischen der dort erzielten Zeit und der verlorenen Zeit bei Bereitstellung, Skalierbarkeit und Integration? – Ian

+0

@ Jeroen: Ich stimme nicht mit dem überein, was Sie gesagt haben. Es ist eine architektonische Entscheidung. Ich kann über Rails nicht sagen, aber Java-Frameworks erwarten keine vollständige Java-Anwendung. Das ist das Gegenteil, das wir heute sehen. Es gibt keine Wunderwaffe und wir müssen die Technologie wählen, die jedes Problem am besten anspricht. Wenn Sie eine große SOA-Anwendung erstellen, ist diese klare Trennung von Bedenken vielleicht der richtige Weg (Twitter zum Beispiel). – Trein

4

Ich habe ein ähnliches Paar für eines meiner Projekte verwendet, aber anstelle von RoR habe ich Python verwendet. Ich denke nicht, dass es einen großen Unterschied gibt.

Im Allgemeinen gibt es in dieser Art von Programmierung nichts Spezifisches. Zwei wichtige Dinge, die Sie beachten müssen:

  • gute Modularität;
  • durchdachtes Protokoll zwischen RoR und Java.

Zuerst geht es um genaue Funktionsaufschlüsselung zwischen Teilen des Systems. Wir haben einige Probleme, weil wir nicht verstehen, welcher Teil eines Jobs von Java erledigt werden muss und welcher Teil von Python. Im Allgemeinen müssen Sie alle Funktionen, die nahe beieinander liegen, miteinander verknüpfen, und Dinge, die weit entfernt sind, müssen an sehr wenigen Stellen verbunden sein. Ich denke, Sie kennen die Regeln der Modularität, aber wenn Sie verschiedene Sprachen zusammensetzen, müssen Sie viel sorgfältiger darüber nachdenken. Sie können auch daran interessiert sein, mehrere unterschiedliche Java-Dienste zu erstellen (z. B. einen für Datenbank-Caching und einen für alle anderen), um sie später frei kombinieren oder sogar in anderen Projekten verwenden zu können.

Zweitens geht es um die Kommunikation zwischen Ihren Teilen. Ich kann zwei Arten der Kommunikation sehen: über die Datenbank und über das reine Netzwerkprotokoll. Die ersten brauchen irgendwie Netzwerkkommunikation, also verwendeten wir das reine Netzwerkprotokoll, ohne irgendeine andere Möglichkeit, Teile zu verbinden.
Wir hatten viel mit SOAP experimentiert, aber es gab Hunderte von Fehlern: Dieses Protokoll ist ganz in Ordnung, um Dienste in einer Sprache (id Java zu Java) zu verbinden, aber schrecklich für die Verbindung von Diensten in verschiedenen Sprachen - automatische Tools zum Erstellen von WSDLs gab unterschiedliche Ergebnisse für Java und Python, und das manuelle Erstellen eines Schemas war hart und arbeitsintensiv.
So haben wir REST verwendet. Es nutzt alle Funktionen des HTTP-Protokolls wie alle vier Haupt-HTTP-Methoden (POST, GET, PUT, DELETE), Fehlercodes und viele andere Dinge, so dass es fast alles deckt, was Sie wollen. Die einzige Einschränkung bei REST besteht darin, dass sie den Status nicht halten kann. Daher müssen Sie möglicherweise Ihren eigenen Sitzungsmechanismus implementieren.
Wenn Sie mit REST nicht sehr vertraut sind und ein reales Beispiel suchen, finden Sie unter Facebook Graph API und für die Implementierung von REST-Diensten in Java können Sie Restlets verwenden.

+0

Toller Kommentar über Modularität und Kommunikation, danke. Haben Sie sich bewusst für REST gegenüber JSON-Alternativen entschieden? Wenn ja, was war dein Gedankengang dort? – Ian

+0

Meinst du, warum wir REST_ anstelle von JSON verwendet haben? Wir haben es nicht getan. REST ist nur eine Architektur, Sie können eine beliebige Darstellung verwenden, um Daten zu übertragen. Wir mussten XML verwenden (wir mussten unseren Dienst für ein anderes Entwicklerteam verfügbar machen), aber im Allgemeinen ist es ratsam, das REST-Modell mit JSON als Hauptdarsteller zu verwenden. Um zum Beispiel mit 'Foo'-Tabelle in DB zu arbeiten, make url'/foo/ ', benutze die Methode' PUT', um eine neue 'Foo' -Instanz hinzuzufügen,' POST' zu aktualisieren, 'DELETE' zu entfernen und' GET' zu abrufen - das ist REST. Und tatsächliche Daten für alle diese URLs können als JSON-Zeichenfolge dargestellt werden. Lesen Sie einige Informationen über REST;) – ffriend

+0

Und wieder sehen Facebook Graph API - sie verwenden REST-Architektur und JSON-vertretene Objekte. – ffriend

2

Ich möchte Sie dringend auffordern, das Frontend und Backend aus Performance-Gründen in derselben JVM zu verwenden.

Für Rails kann JRuby Rails ausführen, und Sie können es in einem Java EE-Container haben, der eine schnelle Kommunikation zwischen den Komponenten ermöglicht.

Mehrere Architekturen, die nicht im selben Prozess laufen, erfordern eine netzwerkbasierte Kommunikation, die viel länger dauert, als nur einen Verweis auf ein Objekt zu übergeben (ich erwarte nicht, dass Sie Shared Memory verwenden wollen).

+0

Kommunikation und der damit verbundene Performance-Hit ist definitiv ein großer Teil der Entscheidung. Wie qualifiziere/quantifiziere ich diesen Leistungshit? Eine Webapp hat bereits Netzwerkanrufe zu Dingen wie memcached und vielleicht solr. Die Leistung dort ist mir nicht aufgefallen. Wird es anders sein, wenn Sie andere Java-Dienste anrufen? – Ian

+0

Soweit JRuby, sehe ich die Integration mit Spring 3 ist nicht zu glatt aus dem Blick auf die Dokumentation. Auch Community-Unterstützung wie Plugins für JRuby ist nicht so ausgeprägt. Nichts, was ich quantifizieren kann, sondern nur ein Gefühl. Hast du Erfahrungen damit? – Ian

+0

ørn Ravn Anderse: Jedes Mal, wenn Sie Daten aus der DB auswählen, führen Sie eine Netzwerkkommunikation durch, denken Sie darüber nach. Ja, es ist langsamer als eine Referenz zu übergeben, aber nicht so entscheidend. – ffriend

6

Ich habe noch nie eine Rails-Entwicklung gemacht, aber hier sind meine Gedanken. Warum nicht einfach Grails benutzen? Ich habe eine ganze Menge Grails-Entwicklung gemacht und es funktioniert gut für Rapid Prototyping. Es bietet auch alle Möglichkeiten von Java, Spring und Hibernate. Anstatt sich mit der Kommunikation zwischen zwei verschiedenen Technologien zu befassen, könnten Sie die Tatsache ausnutzen, dass Grails Spring und Hibernate unter dem Deckmantel verwendet, um mit dem Caching und allen anderen Anforderungen, die diese Technologien unterstützen, umzugehen. Wenn Sie Java-Entwickler haben, sollten Grails nicht schwer zu erlernen sein. Die Geschichte des Grails-Plugins ist anständig. Alle sind an einem zentralen Ort gespeichert und leicht zu bekommen, aber die Qualität hängt vom Autor des Plugins ab. Sie müssen sich auch daran erinnern, dass Grails, das Groovy verwendet, das syntaktisch ähnlich zu Java ist und auf der JVM läuft, sehr einfach ist, vorhandenen Java-Code einschließlich der Vielzahl von verfügbaren Java-Bibliotheken zu verwenden. Ich weiß es nicht sicher, aber ich nehme an, es gibt viel mehr Bibliotheken für die Verwendung mit Java und dort für mit Grails sind dann für die Ruby-Sprache und Rails verfügbar. Ich kann keinen Aufruf für die Ressourcennutzung für Sie machen, aber meine Frage wäre, wie viele Leute Sie mit der Erfahrung haben, Rails-Systeme zu entwerfen, die Java am Backend mit all den damit verbundenen Fehlern verwenden? Sie werden feststellen, dass Sie niemanden haben, der das Debugging beherrscht, wenn bei der Kommunikation zwischen den beiden Technologien etwas schief geht.

+0

Grails macht definitiv Sinn als Alternative. Für mich ist es zu diesem Zeitpunkt eher ein Dilemma der Humanressourcen. Wir haben einige Java-Experten und einige Rails-Experten. Die Verwendung von Grails würde dazu führen, dass beide Parteien hochfahren müssen. Zumindest auf jeder Seite werden einige Leute die kleinen Fallstricke kennen, anstatt alle auf Neuland zu haben. Lösung macht Sinn. Ich habe mich vom Kompromiss nicht überzeugt. Gedanken? – Ian

+0

Ein weiterer Aspekt, für den ich nicht genug Erfahrung habe, ist die Plugin/Edelstein-Unterstützung für Grails. Wie viel Prozent der Plugins/Edelsteine, die ich in Rails finden kann, kann ich auch in Grails finden? Grob gesagt natürlich. – Ian

+0

@lan, wie viel Prozent der Rails-Plugins sind noch kompatibel mit der letzten Version von Rails? fast keiner ... – Kedare

1

Twitter.com verwendet angeblich ein Java-Backend und Rails für ihre Web-Schnittstelle. Hier sind einige Ressourcen:

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

Insbesondere verwenden sie Scala auf dem Back-End (die Java-Bytecode kompiliert):

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

Ich glaube nicht, dass irgendwas mit diesem appro ist falsch ach. Sie werden jedoch zwei verschiedene Plattformen/VMs unterstützen. Ich habe gesehen, dass diese Art von Situationsbildung zu einer Art von Know-how-Zersplitterung innerhalb einer Organisation führt. Und am Ende zahlen Sie viel, um zwei Arten von Fachwissen im Haus zu haben.

Wenn das Problem der Segmentierung Know-how betrifft, würde ich vorschlagen, JRuby of Rails zu laufen. Es ist jetzt sehr ausgereift - und läuft besser als Rails auf Ruby 1.8.x.

1

Wir haben Ruby on Rails für Front-End und Core-Java SOAP Api für Backend verwendet. Es hat sehr gut funktioniert.

Das Hauptproblem ist nicht mit der Leistung, sondern mit den Menschen. Es ist sehr schwierig, Experten in Ruby on Rails für alles einzustellen, stattdessen stellen Sie nur wenige ein, oder Sie können einfach die Benutzeroberfläche von Rails erlernen.

Als Startup-Sicht ist es die beste Strategie. So viele glauben, dass ROR das Beste für Startups ist ... aber nur sehr wenige wussten es, weil wir in den meisten MNCs Java verwenden. Daher besteht der Druck, Rails und Code zu lernen oder nur sehr wenige ROR-Entwickler einzustellen. Stattdessen können Sie ROR für das Frontend verwenden (das tun nur wenige oder es ist einfach zu erlernen) und erfahrene Java-Entwickler für DB-Updates und Geschäftslogik verwenden.

Verwandte Themen