Ich habe eine Anwendung, die eine Mischung aus Java und C++ auf 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. Gemeinsam genutzter Speicher 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.Hohe Verfügbarkeit und skalierbare Plattform für Java/C++ unter Solaris
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 wird durch den C++ Code genommen. 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.
Alle Daten, die wir vom Gerät erhalten, haben eine Kennung, die 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++ - Datenbehandlung 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 Boxen, während immer noch auf den Gerätekontext Bezug genommen werden kann.
Ich sollte beachten, wir haben keine Kontrolle über das Protokoll von den Geräten selbst verwendet, und es gibt keine Möglichkeit, dass sich die Situation ändern wird.
Wir wissen, wir müssen von dieser weg bewegen zu können horizontalen Skalierung von mehreren Maschinen zum Cluster hinzufügen, und ich bin in den frühen Stadien der genau herauszufinden, wie wir dies tun.
Momentan 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 für die Leistung müssen wir auch eine hohe Verfügbarkeit in Betracht ziehen. Die Anwendung muss die ganze 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, die mir gegeben wurde, übernehmen mussten, was würden Sie tun?
EDIT: Basierend auf den Daten von @John Channing, ich gucke sowohl GigaSpaces und Gemstone. Oracle Coherence und IBM ObjectGrid scheinen Java-only zu sein.
Es gibt einige ausgezeichnete Links hier, John. Vielen Dank. Ich muss etwas vorlesen. – Andrew