Question

J'ai une application qui est un mélange de Java et C++ sur Solaris.Les aspects Java du code exécutent l'interface utilisateur Web et établissent l'état sur les appareils avec lesquels nous parlons, et le code C++ effectue le traitement en temps réel des données provenant des appareils.La mémoire partagée est utilisée pour transmettre les informations sur l'état et le contexte du périphérique du code Java au code C++.Le code Java utilise une base de données PostgreSQL pour conserver son état.

Nous sommes confrontés à des goulots d'étranglement assez graves en termes de performances, et pour le moment, la seule façon d'évoluer est d'augmenter le nombre de mémoire et de processeur.Nous sommes bloqués sur un seul boîtier physique en raison de la conception de la mémoire partagée.


Le plus gros succès ici vient du code C++.L'interface Web est assez peu utilisée pour configurer les appareils ;là où nous avons vraiment du mal, c'est à gérer les volumes de données que les appareils fournissent une fois configurés.

Chaque élément de données que nous récupérons de l'appareil contient un identifiant qui renvoie au contexte de l'appareil, et nous devons le rechercher.À l'heure actuelle, il existe une série d'objets de mémoire partagée qui sont maintenus par le code Java/UI et référencés par le code C++, et c'est là le goulot d'étranglement.En raison de cette architecture, nous ne pouvons pas déplacer la gestion des données C++ vers une autre machine.Nous devons être capables d'évoluer afin que divers sous-ensembles de périphériques puissent être gérés par différentes machines, mais nous perdons ensuite la possibilité d'effectuer cette recherche contextuelle, et c'est le problème que j'essaie de résoudre :comment décharger le traitement des données en temps réel vers d'autres boîtiers tout en pouvant se référer au contexte de l'appareil.

Je dois noter que nous n’avons aucun contrôle sur le protocole utilisé par les appareils eux-mêmes et qu’il n’y a aucune chance que cette situation change.


Nous savons que nous devons nous éloigner de cela pour pouvoir évoluer en ajoutant davantage de machines au cluster, et j'en suis aux premiers stades de la détermination exacte de la manière dont nous allons procéder.

À l'heure actuelle, je considère Terracotta comme un moyen de faire évoluer le code Java, mais je n'ai pas encore trouvé comment faire évoluer le C++ pour qu'il corresponde.

En plus de l'évolution des performances, nous devons également prendre en compte la haute disponibilité.L'application doit être disponible quasiment tout le temps -- pas absolument à 100 %, ce qui n'est pas rentable, mais nous devons faire un travail raisonnable pour survivre à une panne de machine.

Si vous deviez entreprendre la tâche qui m'a été confiée, que feriez-vous ?

MODIFIER:Sur la base des données fournies par @john Channing, je regarde à la fois GigaSpaces et Gemstone.Oracle Coherence et IBM ObjectGrid semblent être uniquement Java.

Était-ce utile?

La solution

La première chose que je ferais serait de construire un modèle du système pour cartographier le flux de données et essayer de comprendre précisément où se situe le goulot d'étranglement.Si vous pouvez modéliser votre système comme un pipeline, vous devriez alors être capable d'utiliser la théorie des contraintes (la plupart de la littérature porte sur l'optimisation des processus métier mais elle s'applique également aux logiciels) pour améliorer continuellement les performances et éliminer les goulots d'étranglement.

Ensuite, je collecterais des données empiriques concrètes qui caractérisent avec précision les performances de votre système.C'est un peu un cliché de dire qu'on ne peut pas gérer ce qu'on ne peut pas mesurer, mais j'ai vu de nombreuses personnes tenter d'optimiser un système logiciel en se basant sur des intuitions et échouer lamentablement.

Ensuite, j'utiliserais le Principe de Pareto (règle des 80/20) choisir le petit nombre de choses qui produiront les gains les plus importants et se concentrer uniquement sur celles-là.

Pour mettre à l'échelle une application Java horizontalement, j'ai utilisé Cohérence Oracle largement.Bien que certains le considèrent comme un produit très coûteux table de hachage distribuée, les fonctionnalités sont bien plus riches que cela et vous pouvez, par exemple, accéder directement aux données du cache depuis Code C++ .

D'autres alternatives pour mettre à l'échelle horizontalement votre code Java seraient Espaces Giga, Grille d'objets IBM ou Pierre précieuse Feu de gemme.

Si votre code C++ est sans état et est utilisé uniquement à des fins de calcul, vous pouvez envisager de distribuer le processus en utilisant Grille GLACE qui a des liaisons pour toutes les langues que vous utilisez.

Autres conseils

Vous devez évoluer latéralement et vers l'extérieur.Peut-être quelque chose comme un file d'attente des messages pourrait être le backend entre le frontend et le crunching.

Andrew (en plus de la modélisation en tant que pipeline, etc.), mesurer les choses est important.Avez-vous exécuté un profileur sur le code et obtenu des mesures sur l'endroit où la plupart du temps est passé ?

Pour le code de la base de données, à quelle fréquence change-t-il ?Envisagez-vous la mise en cache pour le moment ?Je suppose que vous avez examiné les index, etc. sur les données pour accélérer la base de données ?

Quels niveaux de trafic avez-vous sur le front-end ?Mettez-vous en cache des pages Web ?(Il n'est pas trop difficile de dire qu'il faut utiliser une API de type JMS pour communiquer entre les composants.Vous pouvez ensuite placer le composant de page Web sur une machine (ou plusieurs), puis placer le code d'intégration (c++) sur une autre, et pour de nombreux produits JMS, il existe généralement des API C++ natives, c'est-à-dire.ActiveMQ me vient à l'esprit), mais cela aide vraiment de savoir combien de temps passe sur le Web (JSP ?), C++, les opérations de base de données.

La base de données stocke-t-elle des données commerciales ou est-elle également utilisée pour transmettre des données entre Java et C++ ?Vous dites que vous utilisez la mémoire partagée et non JNI ?Quel niveau de multithreading existe actuellement dans l’APP ?Décririez-vous le code comme étant de nature synchrone ou asynchrone ?

Existe-t-il une relation physique entre le code Solaris et les appareils qui doivent être entretenus (c.-à-d.tous les appareils s'enregistrent-ils avec le code C++, ou cela peut-il être spécifié).c'est à dire.si vous deviez installer un équilibreur de charge Web sur le frontend et que vous installiez simplement 2 machines aujourd'hui, la relation entre les appareils gérés par une boîte initialisée à l'avance ou à l'avance ?

Quelles sont les exigences HA ?c'est à dire.juste donner des informations ?La haute disponibilité peut-elle être effectuée uniquement au niveau Web en regroupant les données de session ?

La base de données fonctionne-t-elle sur une autre machine ?

Quelle est la taille de la base de données ?Avez-vous optimisé vos requêtes, c'est-à-dire.j'ai essayé d'utiliser des jointures internes/externes explicites, parfois utiles par rapport aux sous-requêtes imbriquées (parfois).(regardez à nouveau les statistiques SQL).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top