Imagine un escenario de la siguiente manera: Digamos que tiene una computadora central que genera muchos datos. Estos datos deben pasar por algún procesamiento, que desafortunadamente lleva más tiempo que generarlos. Para que el procesamiento se ponga al día con el tiempo real, conectamos más computadoras esclavas.
Además, debemos tener en cuenta la posibilidad de que los esclavos abandonen la red a mitad del trabajo, así como la adición de esclavos adicionales. La computadora central debe garantizar que todos los trabajos se hayan completado satisfactoriamente, y que los trabajos eliminados por un esclavo se vuelvan a asignar a otro.
La pregunta principal es: ¿Qué enfoque debo usar para lograr esto?
Pero quizás lo siguiente me ayudaría a llegar a una respuesta: ¿Hay un nombre o patrón de diseño para lo que estoy tratando de hacer?
¿Qué dominio de conocimiento necesito para lograr el objetivo de que estas computadoras se comuniquen entre sí? (p. ej., ¿será suficiente una base de datos, de la que tengo algún conocimiento, o esto involucrará sockets, de los cuales aún no tengo conocimiento?)
¿Hay algún ejemplo de tal sistema? La pregunta principal es un poco general, por lo que sería bueno tener un punto de partida / punto de referencia.
Tenga en cuenta que estoy asumiendo restricciones de c ++ y windows, por lo que se agradecerán las soluciones que apunten en esa dirección.
Respuestas:
Si. Este patrón se conoce como computación distribuida (o programación distribuida o cualquier palabra genial que desee poner después de distribuida). Mi sugerencia será no construir esto internamente antes de buscar otras soluciones. Puede consultar esta pregunta de desbordamiento de pila para conocer varias opciones. Y luego toma una decisión calculada.
fuente
Como se observó en otras respuestas, este campo se conoce como computación distribuida , computación en cuadrícula , computación en clúster y computación de alto rendimiento .
Permítanme agregar la distinción de que, cuando un sistema puede redimensionarse después de comenzar a coincidir con la carga de trabajo, se dice que es " elástico ", y esto es diferente de la computación en cuadrícula tradicional. Esa es una de las razones (no relacionadas con el marketing) del término " computación en la nube ": el usuario no necesita planificar la capacidad, y el número y la ubicación de las máquinas que llevan a cabo la computación no tienen características como una nube.
Además, su requisito de que el maestro vuelva a programar tareas fallidas se denomina propiedad de " tolerancia a fallas " de ese sistema. (Enlace obligatorio a esta caricatura )
¿Qué enfoque debe usar para construir su propia nube privada? En mi orden o preferencia:
No construya su propia nube , use la infraestructura proporcionada por otros. Amazon llama a esto Virtual Private Cloud , Rackspace solo Private Cloud ; Estoy seguro de que puede encontrar otras ofertas y compararlas.
No construya su propio motor informático distribuido , utilice el motor proporcionado por otros. Si insiste en usar sus máquinas, use al menos la mayor cantidad de software posible que haya sido provisto y probado por otros. Puede usar Hadoop desde C ++ a través de la interfaz Pipes o desde cualquier ejecutable a través de la API de Streaming . Hay una interfaz de transmisión similar en Spark .
No codifique todos los componentes desde cero , use componentes de la comunidad. Si, por alguna razón, ha leído hasta ahora y desea implementar sus propios componentes en la nube, no comience desde la biblioteca estándar de C ++. Los componentes principales que necesitará son:
Hay muchas alternativas para ambos. Para hacer cola, RabbitMQ tiene un instalador de Windows, al igual que ZeroMQ . Para los sistemas de archivos distribuidos, realmente no tengo suficiente experiencia en Windows: parece que puedes organizar los recursos compartidos SMB en un DFS , pero no puedo darte ninguna pista aquí. Podría pensar, como se señaló en otra respuesta, utilizar una base de datos distribuida como MongoDB para los datos; Se ejecuta en Windows .
También podría pensar en usar MPI (generalmente la implementación de OpenMPI , generalmente a través de su envoltorio Boost ), pero observe que los programas MPI no son elásticos ni tolerantes a fallas per se; debes ocuparte de eso tú mismo (al menos proporcionan algunos mecanismos para lograrlo ). Es por eso que le recomendaría primero que evalúe un marco de distribución que tenga tales propiedades.
fuente