Hochverfügbare und skalierbare Plattform für Java / C ++ unter Solaris

8

Ich habe eine Anwendung, die eine Mischung aus Java und C ++ unter Solaris ist. Die Java-Aspekte des Codes führen die Webbenutzeroberfläche aus und richten den Status auf den Geräten ein, mit denen wir uns unterhalten, und der C ++ - Code verarbeitet die Daten in Echtzeit, die von den Geräten zurückkommen. Shared Memory wird verwendet, um Gerätezustands- und Kontextinformationen vom Java-Code an den C ++ - Code weiterzuleiten. Der Java-Code verwendet eine PostgreSQL-Datenbank, um den Status beizubehalten.

Wir stoßen auf einige ziemlich schwerwiegende Leistungsengpässe, und im Moment können wir nur die Speicher- und CPU-Anzahl erhöhen. Aufgrund des gemeinsamen Speicherdesigns stecken wir auf der einen physischen Box fest.

Der wirklich große Hit hier ist der C ++ - Code. Die Webschnittstelle wird ziemlich leicht zum Konfigurieren der Geräte verwendet. wo wir wirklich Schwierigkeiten haben, ist die Handhabung der Datenmengen, die die Geräte liefern, sobald sie konfiguriert sind.

Jedes Stück Daten, das wir vom Gerät zurückbekommen, enthält einen Identifikator, der auf den Gerätekontext verweist, und wir müssen nachsehen. Im Moment gibt es eine Reihe von Shared-Memory-Objekten, die vom Java / UI-Code verwaltet werden und auf die der C ++ - Code verweist, und das ist der Engpass. Aufgrund dieser Architektur können wir die C ++ - Datenverarbeitung nicht auf einen anderen Rechner verlagern. Wir müssen in der Lage sein, so zu skalieren, dass verschiedene Teilmengen von Geräten von verschiedenen Rechnern gehandhabt werden können, aber dann verlieren wir die Fähigkeit, diese Kontext-Suche durchzuführen, und das ist das Problem, das ich zu lösen versuche: Zeitdatenverarbeitung zu anderen Feldern, während immer noch auf den Gerätekontext verwiesen werden kann.

Ich sollte beachten, dass wir keine Kontrolle über das Protokoll haben, das von den Geräten selbst verwendet wird, und es besteht keine Möglichkeit, dass sich die Situation ändert.

Wir wissen, dass wir uns davon entfernen müssen, um durch das Hinzufügen weiterer Maschinen zum Cluster ausweiten zu können, und ich bin gerade dabei, genau herauszufinden, wie wir das tun.

Im Moment betrachte ich Terracotta als eine Möglichkeit, den Java-Code zu skalieren, aber ich bin noch nicht soweit, herauszufinden, wie man C ++ skalieren kann.

Neben der Skalierung auf Performance müssen wir auch eine hohe Verfügbarkeit in Betracht ziehen. Die Anwendung muss die meiste Zeit verfügbar sein - nicht absolut 100%, was nicht kosteneffektiv ist, aber wir müssen einen vernünftigen Job machen, um einen Maschinenausfall zu überstehen.

Wenn Sie die Aufgabe übernehmen müssten, die ich bekommen habe, was würden Sie tun?

BEARBEITEN: Basierend auf den Daten von @john channing, schaue ich mir sowohl GigaSpaces als auch Gemstone an. Oracle Coherence und IBM ObjectGrid scheinen Java-only zu sein.

    
Andrew 09.09.2008, 05:52
quelle

3 Antworten

5

Als erstes würde ich ein Modell des Systems konstruieren, um den Datenfluss abzubilden und genau zu verstehen, wo der Engpass liegt. Wenn Sie Ihr System als Pipeline modellieren können, sollten Sie in der Lage sein, die Theorie der Einschränkungen zu verwenden (die meisten der Literatur geht es um die Optimierung von Geschäftsprozessen, aber es gilt gleichermaßen für Software), um die Leistung kontinuierlich zu verbessern und den Flaschenhals zu beseitigen.

Als nächstes würde ich einige harte empirische Daten sammeln, die genau die Leistung Ihres Systems charakterisieren. Es ist etwas wie ein Klischee, dass man nicht managen kann, was man nicht messen kann, aber ich habe viele Leute gesehen, die versuchen, ein Softwaresystem basierend auf Ahnungen zu optimieren und kläglich zu versagen.

Dann würde ich das Pareto-Prinzip (80/20-Regel) verwenden, um die kleine Anzahl von Dingen zu wählen, die produziert werden die größten Gewinne und konzentrieren sich nur auf diese.

Um eine Java-Anwendung horizontal zu skalieren, habe ich Oracle Coherence ausführlich verwendet. Obwohl einige es als sehr teure verteilte Hashtabelle ablehnen, ist die Funktionalität viel reicher und Sie können zum Beispiel direkt Zugriff auf Daten im Cache von C ++ - Code .

Andere Alternativen zur horizontalen Skalierung Ihres Java-Codes wären Giga Spaces , IBM Object Grid oder Gemstone Gemfire .

Wenn Ihr C ++ - Code statusfrei ist und nur für die Berechnung von Zahlen verwendet wird, können Sie den Prozess über ICE-Grid , die Bindungen für alle Sprachen enthält, die Sie verwenden.

    
John Channing 09.09.2008, 09:00
quelle
1

Sie müssen seitwärts und auswärts skalieren. Vielleicht könnte so etwas wie eine Nachrichtenwarteschlange das Backend zwischen Frontend und Knirschen sein.

    
Eugene Yokota 09.09.2008 06:05
quelle
1

Andrew (neben der Modellierung als Pipeline usw.) ist es wichtig, Dinge zu messen. Hast du einen Profiler über den Code laufen lassen und Metriken davon bekommen, wo die meiste Zeit verbracht wird?

Wie oft ändert sich der Datenbankcode? Schaust du gerade im Caching? Ich nehme an, Sie haben Indizes usw. über die Daten betrachtet, um das Db zu beschleunigen?

Welche Verkehrsstufen haben Sie am Frontend? Cachieren Sie Webseiten? (Es ist nicht schwer zu sagen, ein JMS-Typ api zu verwenden, um zwischen Komponenten zu kommunizieren. Sie können dann die Webseitenkomponente auf einen Computer (oder mehrere) setzen und dann den Integrationscode (c ++) auf einen anderen und für viele JMS setzen Produkte gibt es in der Regel native C ++ APIs dh ActiveMQ kommt in den Sinn), aber es hilft wirklich zu wissen, wie viel Zeit ist in Web (JSP?), C ++, Datenbank ops.

Wird in der Datenbank Geschäftsdaten gespeichert, oder werden Daten auch zwischen Java und C ++ ausgetauscht? Sie sagen, Sie verwenden Shared Mem nicht JNI? Welche Ebene von Multi-Threading gibt es derzeit in der APP? Würden Sie den Code als synchron oder asynchron beschreiben?

Gibt es eine physikalische Beziehung zwischen dem Solaris-Code und den zu wartenden Geräten (dh, registrieren sich alle Geräte mit dem C ++ - Code oder können diese angegeben werden)? dh. Wenn Sie einen Web-Load-Balancer auf das Frontend setzen und nur zwei Maschinen aufstellen würden, ist die Beziehung zwischen den Geräten, die von einer voraus initialisierten Box verwaltet werden, oder vorher?

Was sind die HA-Anforderungen? dh. Informationen einfach angeben? Kann die HA nur durch das Gruppieren von Sitzungsdaten in der Webebene durchgeführt werden?

Wird die DB auf einem anderen Rechner ausgeführt?

Wie groß ist die DB? Haben Sie Ihre Anfragen optimiert, dh. versucht, explizite innere / äußere Joins zu verwenden, hilft manchmal im Vergleich zu verschachtelten Sub-Abfragen (manchmal). (Schau nochmal auf die sql stats).

    
nso1 09.09.2008 12:29
quelle