Frage

Ich habe eine Anwendung, die eine Mischung aus Java und C++ unter Solaris ist.Die Java-Aspekte des Codes führen die Web-Benutzeroberfläche aus und stellen den Status auf den Geräten her, mit denen wir sprechen, und der C++-Code verarbeitet die von den Geräten zurückkommenden Daten in Echtzeit.Gemeinsam genutzter Speicher wird verwendet, um Gerätestatus- und Kontextinformationen vom Java-Code an den C++-Code weiterzuleiten.Der Java-Code verwendet eine PostgreSQL-Datenbank, um seinen Status beizubehalten.

Wir stoßen auf einige ziemlich schwerwiegende Leistungsengpässe und im Moment besteht die einzige Möglichkeit zur Skalierung darin, die Speicher- und CPU-Anzahl zu erhöhen.Aufgrund des Shared-Memory-Designs bleiben wir bei der einen physischen Box hängen.


Der wirklich große Wurf ist hier der C++-Code.Die Weboberfläche wird relativ selten zur Konfiguration der Geräte genutzt;Was uns wirklich schwerfällt, ist die Bewältigung der Datenmengen, die die Geräte nach der Konfiguration liefern.

Jedes Datenelement, das wir vom Gerät zurückerhalten, enthält eine Kennung, die auf den Gerätekontext verweist, und wir müssen diese nachschlagen.Derzeit gibt es eine Reihe gemeinsam genutzter Speicherobjekte, die vom Java/UI-Code verwaltet und vom C++-Code referenziert werden, und das ist der Flaschenhals.Aufgrund dieser Architektur können wir die C++-Datenverarbeitung nicht auf einen anderen Computer verlagern.Wir müssen in der Lage sein, so zu skalieren, dass verschiedene Teilmengen von Geräten von verschiedenen Maschinen verarbeitet werden können, aber dann verlieren wir die Möglichkeit, diese Kontextsuche durchzuführen, und das ist das Problem, das ich zu lösen versuche:wie man die Echtzeit-Datenverarbeitung auf andere Boxen verlagert und trotzdem auf den Gerätekontext zugreifen kann.

Ich möchte darauf hinweisen, dass wir keine Kontrolle über das von den Geräten selbst verwendete Protokoll haben und keine Chance besteht, dass sich die Situation ändert.


Wir wissen, dass wir uns davon lösen müssen, um eine Skalierung durch das Hinzufügen weiterer Maschinen zum Cluster zu ermöglichen, und ich bin gerade dabei, genau zu erarbeiten, wie wir das machen werden.

Im Moment schaue ich mir Terrakotta als eine Möglichkeit an, den Java-Code zu skalieren, aber ich bin noch nicht so weit gekommen, herauszufinden, wie ich C++ entsprechend skalieren kann.

Neben der Skalierung für die Leistung müssen wir auch die Hochverfügbarkeit berücksichtigen.Die Anwendung muss nahezu die ganze Zeit über 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 mir gegeben wurde, was würden Sie tun?

BEARBEITEN:Basierend auf den von @john channing bereitgestellten Daten schaue ich mir sowohl GigaSpaces als auch Gemstone an.Oracle Coherence und IBM ObjectGrid scheinen nur für Java verfügbar zu sein.

War es hilfreich?

Lösung

Als Erstes würde ich ein Modell des Systems erstellen, um den Datenfluss abzubilden und zu versuchen, genau zu verstehen, wo der Engpass liegt.Wenn Sie Ihr System als modellieren können Pipeline, dann sollten Sie in der Lage sein, die Theorie der Einschränkungen (die meiste Literatur beschäftigt sich mit der Optimierung von Geschäftsprozessen, sie gilt aber auch für Software) zur kontinuierlichen Leistungsverbesserung und Beseitigung des Engpasses.

Als Nächstes würde ich einige konkrete empirische Daten sammeln, die die Leistung Ihres Systems genau charakterisieren.Es ist so etwas wie ein Klischee, dass man nicht verwalten kann, was man nicht messen kann, aber ich habe viele Leute gesehen, die versucht haben, ein Softwaresystem basierend auf Ahnungen zu optimieren, und dabei kläglich gescheitert sind.

Dann würde ich das verwenden Pareto-Prinzip (80/20-Regel) die wenigen Dinge auszuwählen, die den größten Gewinn bringen, und sich nur auf diese zu konzentrieren.

Um eine Java-Anwendung horizontal zu skalieren, habe ich verwendet Oracle-Kohärenz ausführlich.Obwohl einige es als sehr teuer abtun verteilte Hashtabelle, die Funktionalität ist viel umfangreicher und Sie können beispielsweise direkt auf Daten im Cache zugreifen C++-Code .

Andere Alternativen zur horizontalen Skalierung Ihres Java-Codes wären Giga-Räume, IBM Object Grid oder Edelstein-Edelsteinfeuer.

Wenn Ihr C++-Code zustandslos ist und ausschließlich zur Zahlenverarbeitung verwendet wird, könnten Sie die Verteilung des Prozesses mit in Betracht ziehen ICE-Gitter mit Bindungen für alle von Ihnen verwendeten Sprachen.

Andere Tipps

Sie müssen seitwärts und nach außen skalieren.Vielleicht so etwas wie ein Nachrichtenwarteschlange könnte das Backend zwischen dem Frontend und dem Crunching sein.

Andrew, (neben der Modellierung als Pipeline usw.) ist das Messen von Dingen wichtig.Haben Sie einen Profiler über den Code laufen lassen und Messwerte darüber erhalten, wo die meiste Zeit verbracht wird?

Wie oft ändert sich der Datenbankcode?Denken Sie derzeit über Caching nach?Ich gehe davon aus, dass Sie sich Indizes usw. über die Daten angesehen haben, um die Datenbank zu beschleunigen?

Welchen Traffic haben Sie im Frontend?Zwischenspeichern Sie Webseiten?(Es ist nicht allzu schwer zu sagen, dass für die Kommunikation zwischen Komponenten eine API vom Typ JMS verwendet werden soll.Sie können dann die Webseitenkomponente auf einem (oder mehreren) Computern platzieren und dann den Integrationscode (C++) auf einem anderen Computer platzieren. Für viele JMS-Produkte gibt es normalerweise native C++-APIs, d. h.ActiveMQ fällt mir ein), aber es hilft wirklich zu wissen, wie viel Zeit in Web- (JSP?), C++- und Datenbankoperationen steckt.

Speichert die Datenbank Geschäftsdaten oder wird sie auch zum Übertragen von Daten zwischen Java und C++ verwendet?Sie sagen, Sie verwenden Shared Mem, nicht JNI?Welche Multithreading-Stufe gibt es derzeit in der APP?Würden Sie den Code als synchron oder asynchron bezeichnen?

Gibt es eine physische Beziehung zwischen dem Solaris-Code und den Geräten, die gepflegt werden müssen (d. h.Registrieren Sie alle Geräte mit dem C++-Code oder kann dies angegeben werden).dh.Wenn Sie einen Web-Load-Balancer im Frontend installieren würden und heute nur zwei Maschinen aufstellen würden, wäre die Beziehung, welche Geräte von einer Box verwaltet werden, im Voraus oder im Voraus initialisiert?

Was sind die HA-Anforderungen?dh.einfach Infos angeben?Kann die HA nur in der Webschicht durch Clustering von Sitzungsdaten durchgeführt werden?

Läuft die Datenbank auf einer anderen Maschine?

Wie groß ist die DB?Haben Sie Ihre Abfragen optimiert, z.Der Versuch, explizite innere/äußere Verknüpfungen zu verwenden, hilft manchmal im Vergleich zu verschachtelten Unterabfragen (manchmal).(Schauen Sie sich noch einmal die SQL-Statistiken an).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top