Tengo una aplicación que es una mezcla de Java y C++ en Solaris. Los aspectos Java del código ejecutan la interfaz de usuario web y establecen el estado en los dispositivos con los que estamos hablando, y el código C++ hace el crujido en tiempo real de los datos que regresan de los dispositivos. La memoria compartida se utiliza para pasar el estado del dispositivo y la información de contexto desde el código de Java hasta el código de C++. El código de Java usa una base de datos PostgreSQL para persistir en su estado.Alta disponibilidad y plataforma escalable para Java/C++ en Solaris
Nos encontramos con algunos cuellos de botella de rendimiento bastante severos, y en este momento la única forma en que podemos escalar es aumentar la memoria y el recuento de CPU. Estamos atrapados en la única caja física debido al diseño de memoria compartida.
El gran éxito aquí está siendo tomado por el código C++. La interfaz web es bastante poco utilizada para configurar los dispositivos; lo que realmente nos cuesta es manejar los volúmenes de datos que entregan los dispositivos una vez configurados.
Cada dato que obtenemos del dispositivo tiene un identificador que apunta al contexto del dispositivo, y tenemos que buscarlo. En este momento hay una serie de objetos de memoria compartida mantenidos por el código Java/UI y referidos por el código C++, y ese es el cuello de botella. Debido a esa arquitectura, no podemos mover el manejo de datos C++ a otra máquina. Necesitamos ser capaces de escalar para que varios subconjuntos de dispositivos puedan ser manejados por máquinas diferentes, pero luego perdemos la capacidad de hacer esa búsqueda de contexto, y ese es el problema que estoy tratando de resolver: cómo descargar el real- tiempo de procesamiento de datos a otras cajas al mismo tiempo que se puede referir al contexto del dispositivo.
Debo señalar que no tenemos control sobre el protocolo utilizado por los propios dispositivos, y no hay posibilidad de que la situación cambie.
sabemos que necesitamos a alejarse de este ser capaz de escalar a cabo mediante la adición de más máquinas a la agrupación, y yo estoy en las primeras etapas de la elaboración de exactamente cómo vamos a hacer esto.
En este momento estoy viendo a Terracotta como una forma de ampliar el código de Java, pero no he llegado a la conclusión de cómo escalar el C++ para que coincida.
Además de aumentar el rendimiento, también debemos tener en cuenta la alta disponibilidad. La aplicación debe estar disponible casi todo el tiempo, no completamente al 100%, lo que no es rentable, pero tenemos que hacer un trabajo razonable para sobrevivir a una interrupción de la máquina.
Si tuvieras que realizar la tarea que me han encomendado, ¿qué harías?
EDIT: Basado en los datos proporcionados por @john channing, estoy viendo tanto GigaSpaces como Gemstone. Oracle Coherence e IBM ObjectGrid parecen ser solo de Java.
Aquí hay algunos enlaces excelentes, John. Gracias. Tengo algo de lectura que hacer. – Andrew