Estaba discutiendo este tema con alguien el viernes pasado. Esta es definitivamente un área desafiante y con preguntas de investigación abiertas. Algo de esto dependerá de los detalles del sistema distribuido para el que está programando.
Cosas que debes considerar:
- Disponibilidad de recursos
- Ubicación de los datos
- Costo de las comunicaciones.
El modelo más simple es aquel en el que asume recursos homogéneos, con ubicación conjunta de datos y un costo de comunicaciones uniforme. Ahora lo ha colapsado al problema de programación NP-hard. Como el Algoritmo de Optimización de Enjambre de Partículas Híbridas Evolutivas para Resolver Problemas de Programación de Taller de Flujo NP-Hard Sin Espera describe (por ejemplo). La literatura está llena de análisis de programación. Sabemos que la programación de una sola máquina es NP difícil.
Por lo tanto, la programación distribuida de trabajos es al menos igual de difícil.
- ¿Cuál es el mejor diseño y desarrollo web o aprendizaje de Java?
- ¿Puedo usar mi título de abogado en diseño web?
- ¿Es factible ser un diseñador de producto / industrial en Singapur?
- ¿Cuáles son las mejores empresas de servicios de diseño web en Hyderabad?
- ¿Qué es el sobre diseño?
Lo que nos sale bien en la programación no es tratar de ser correcto, nos esforzamos por abordar el comportamiento correcto.
Cuando miramos el mundo real, tenemos:
- Recursos heterogéneos que fallan con cierta probabilidad
- Distribución asimétrica de datos.
- Redes de comunicaciones de costo variable.
Esa conversación del viernes fue sobre el uso de las Teorías del Módulo de Satisfacción (SMT) para determinar cuál era la solución óptima. Sugerí usar eso como un medio para evaluar soluciones potenciales: usted sabe cuál es la solución óptima basada en restricciones instantáneas, por lo que ahora puede evaluar algoritmos dinámicos utilizando análisis estático en varios puntos en el tiempo. Por supuesto, no sé si es una buena idea, o no.
Mientras reflexionaba sobre esta pregunta (antes de escribir esta respuesta), vi un artículo interesante sobre el almacenamiento en caché. Esto me hizo preguntarme si una forma de hacer algo como esto podría ser ver esto como un modelo de costo; en otras palabras, programar de acuerdo a cuánto alguien está dispuesto a pagar por algo.
Eso no es realmente muy diferente de lo que hacen los proveedores de la nube: usted paga por los recursos en función de su compromiso garantizado con ellos. El precio spot es diferente al precio dedicado y algunos servicios tienen garantías estrictas, mientras que otros no.
De alguna manera, la programación distribuida es similar a la programación multiprocesador. ¿Qué hay en la memoria caché para esa CPU , y cuál es el costo de acceder a esta porción de memoria y cuál es el consumo de energía de esta CPU ?
La programación es difícil . No podemos hacerlo bien en una sola caja (The Linux Scheduler: A Decade of Wasted Cores). Los problemas son similares.
Así que así es como lo abordaría:
- Objetivos: establece lo que estás tratando de lograr. Te sugiero que evites tratar de ser perfecto. Lo que quieres es eficiente .
- Medio ambiente: ¿estás procesando gráficos? ¿Este mapa se reduce? ¿Estás manejando la transmisión de datos? ¿Aprendizaje automático?
- Falla: esta es la parte difícil de un sistema distribuido. ¿Qué haces cuando las cosas van mal? Y siempre salen mal en un sistema distribuido.
- Restricciones: piense en las restricciones del problema. He mencionado varios:
- Recursos heterogéneos
- Localidad de datos
- Manejo de fallas
más cosas que no mencioné antes:
- Fracaso bizantino (qué sucede cuando alguien te miente)
- Seguridad
- El consumo de energía
- Costos de red (latencia y ancho de banda)
- Restricciones de servicio: tal vez desee un planificador de trabajos distribuido en tiempo real (¿porque esto ya no es lo suficientemente difícil?)
Dado que no sé qué tipo de cargas de trabajo su programación y la escala de lo que está haciendo, es difícil sugerir algo específico. Supongo que está familiarizado con la literatura, pero por las dudas:
Conjuntos de datos distribuidos resistentes
Computación distribuida en la práctica: la experiencia Condor
Dríada
Gorrión
Servidor de parámetros
Fénix
(estos son solo algunos de estos sistemas, hay muchos otros por ahí).
Este es un campo de investigación realmente interesante y acabo de arañar la superficie aquí.