2010-07-21 18 views
5

Estoy trabajando en un sistema que divide a los usuarios por organización. Cada usuario pertenece a una organización. Cada organización almacena sus datos en su propia base de datos que reside en una máquina servidor de base de datos. Un servidor db puede administrar bases de datos para 1 o más organizaciones.Cómo 'habilitar web' una aplicación heredada de C++

El sistema existente (heredado) supone que solo hay una organización, sin embargo, quiero 'escalar' la aplicación ejecutando una 'instancia' de ella (vinculada a una organización) y ejecutar varias instancias en la máquina del servidor (es decir, ejecute varias instancias de la aplicación 'organización única', una instancia para cada organización).

Proporcionaré una API RESTful para cada instancia que se esté ejecutando en el servidor, de forma que se pueda utilizar un thin client para acceder a los servicios proporcionados por la instancia que se ejecuta en la máquina del servidor.

Aquí es un esquema sencillo que muestra las relaciones:

Servidor 1 -> Base de datos N (cada organización tiene una base de datos)

organización 1 -> N usuarios

Mi pregunta se refiere a cómo "dirigir" las solicitudes RESTful de un cliente, a la instancia apropiada que maneja las solicitudes de los usuarios para esa organización.

Más específicamente, cuando recibo una solicitud RESTful, será de un usuario (que pertenece a una organización), cómo (o de hecho, cuál es la mejor manera) para 'enrutar' la solicitud a la instancia de aplicación apropiada corriendo en el servidor?

Respuesta

1

Por lo que puedo deducir, esto es esencialmente un problema de fragmentación. Independientemente de cómo dividir las instancias a nivel de hardware (usando máquinas virtuales, servidores múltiples, todo en un servidor potente, etc.), necesita una capa central de registro e intermediación en su arquitectura general que asigna usuarios a la instancia de destino correcta por solicitud .

Hay muchas maneras de implementar esto, por supuesto, simplemente elija uno que sepa y que sea rápido, y se escalará, ya que todas las solicitudes se obtendrán a través de él. Sugeriría una aplicación web ligera sin estado respaldada por una base de datos simple de solo lectura que haga el identificador de cliente apropiado -> mapeo de instancia, que usted cargaría en la memoria/caché. Para agregar flexibilidad en el hardware y la ubicación de la instancia, use (suponiendo que Java) JNDI para almacenar la información de hardware/puerto/etc. para cada instancia, y en su mapeo de identificadores, asigne el identificador del cliente a la clave de búsqueda JNDI correspondiente.

+0

respuesta más pragmática, supongo :) – morpheous

0

Esa es una pregunta muy difícil; simplemente porque hay muchas respuestas posibles, y cuál es la mejor solo puede ser determinada por usted y su entorno.

Escribiría un módulo de apache en C++ para hacer eso. Usando this book, logré comenzar a escribir módulos muy eficientes.

Para poder ofrecerle más soluciones (¿tal vez simplemente configurar un proxy de Squid?), Tendrá que especificar cómo podrá determinar a qué servidor necesita redirigir al cliente. Si puede hacerlo por IP, a través de un parámetro GET, a través de un parámetro POST XML (como SOAP). Etc.

+0

Debo admitir que me sedujo la idea de escribir un módulo de Apache, pero el punto que Ahmed hizo me devolvió a la realidad :) – morpheous

+0

@morpheous Ya lo hice, y no fue tan malo. Usando un tutorial como base para mi aplicación, estaba listo y funcionando en medio día. A partir de ese momento, nunca tuve que regresar y tocar cualquier cosa específica de Apache. – Gianni

0

Como la otra respuesta dice que hay muchas maneras de abordar este problema. Supongamos que NO tiene acceso al código fuente del software heredado, lo que significa que no puede modificarlo para escuchar en diferentes puertos para diferentes instancias.

Escribir el módulo de Apache parece MUY extremo para resolver este problema (y como alguien que acaba de terminar de escribir un módulo de producción de apache, sugiero evitarlo a menos que esté ganando mucho dinero).

El enfoque puede ser tan esotérico como desee. Por ejemplo, si su software heredado se ejecuta en una arquitectura Intel normal y tiene la capacidad de hardware, existen soluciones de VM, donde debería poder crear una máquina virtual delgada, una que ejecute una sola instancia del software y un multiplexor para vincularlas todas.

Si, por otro lado, está ejecutando algo así como HPUX :-) existen otros enfoques. ¿Qué hay de dar un poco más de detalle?

Ahmed.

1

Dejar que la API pública especifique que el usuario me suena un poco frágil. Cambiaría la API pública para que las solicitudes especifiquen tanto la organización como el usuario, y luego tienen algo trivial en el lado del servidor que asigna organizaciones a las instancias (por ejemplo, la organización foo -> instancia que escucha en el puerto 7331).

+0

Es verdad, pero cambiar el API es un problema trivialmente simple de resolver. – morpheous

Cuestiones relacionadas