Cómo simular un sistema distribuido en mi computadora portátil

Constrúyalo sobre una API de plataforma simple con implementaciones reales y simuladas. Ese es un proyecto de semanas-hombre que se amortiza cuando corrige su primer error en horas que hubieran tardado al menos semanas sin el entorno simulado si pudiera solucionarlo.

En mi último sistema (almacenamiento de valor clave persistente de alto rendimiento con contenedores que podrían ser fuertes o eventualmente consistentes) eso fue

  1. register_recv toma un identificador de servicio, cierre + contexto de ejecución aplicado al recibirlo
  2. send_msg toma un mensaje / metadatos y cierre opcional + contexto de ejecución para la respuesta. Los mensajes podrían incluir tiempos de espera, y cerqué las respuestas obsoletas en la capa de mensajería.
  3. un contexto de ejecución predeterminado
  4. un visualizador cronometrado de eventos
  5. gettime devolviendo la hora actual
  6. un PRNG

donde el contexto de ejecución es un despachador de mensajes que aprovecha uno (para la lógica principal) o más (colocando una fachada controlada por eventos en la parte superior de las API con hilos u operaciones vinculadas a la CPU), con un solo contexto de un solo hilo compartido para el entorno de prueba que permite la repetición orden de ejecución cuando el PRNG tiene la misma semilla.

Pasé node-id como parámetro de construcción a cada componente, aunque eso también podría provenir de la API.

En el entorno de prueba, me burlé de la capa de mensajería y el servicio de persistencia, con el bloqueo de nodo simulado desconectando la mensajería y la persistencia y luego liberando el estado. Admití rangos de retardo configurables en la capa de mensajería para permitir perturbar el orden de ejecución. Simulé el tiempo avanzando a la hora del próximo evento programado cuando el sistema se quedó inactivo.

Luego, utilícelo para escribir pruebas deterministas y operaciones pseudoaleatorias o búsquedas de estado validadas contra modelos de corrección. Por ejemplo, las lecturas de una tienda muy consistente no pueden devolver una versión anterior de los datos después de que se haya observado una nueva a través de una lectura o implícita a través de una escritura exitosa.

Hablo más sobre esto en la respuesta de Drew Eckhardt a ¿Cuáles son las mejores prácticas para depurar sistemas / algoritmos distribuidos? y la respuesta de Drew Eckhardt a ¿Cómo diseña / diseña Drew Eckhardt un sistema distribuido que pueda simularse determinísticamente en un solo hilo / proceso para probarlo?

Antes de escribir el software, también desea validar sus protocolos subyacentes a través de TLA + o Promela / Spin, aunque aún necesita verificar el modelo del código completado para encontrar y luego corregir los errores de implementación.

Antes de que los sistemas distribuidos se convirtieran en una necesidad comercial, las personas no sabían mejor y probaron el enfoque de proceso por separado con malos resultados, como eliminar la primera versión de los productos porque los errores del protocolo no se podían arreglar. Ahora lo sabemos mejor y no quieres seguir viviendo en esa cultura primitiva.

Puede (y debe obtener una mejor cobertura de código) realizar pruebas de integración separadas utilizando procesos y luego completar máquinas (virtuales o reales). Combine eso con la inyección de fallas en el nivel bajo de la biblioteca (libc) o del sistema operativo (controlador de filtro de Windows) para obtener aún más confianza en sus rutas de error.

Si desea comprender los sistemas distribuidos, necesita construir una red para esos sistemas que tenga aspectos del mundo real, incluyendo demoras, pérdidas, reordenamientos y otras debilidades de las redes modernas.

Leería la descripción de Dummynet – Página en iet.unipi.it – ​​y su artículo: Marta Carbone y Luigi Rizzo, Dummynet Revisited, ACM SIGCOMM Computer Communication Review, 40 (2) pg.12-20, marzo de 2010.

Una vez que tenga herramientas para simular una red degradada, puede crear algún tipo de conjunto de procesos distribuidos (cliente / servidor, publicación / suscripción o su favorito) sobre esa red y comenzar a comprender algunas cosas que pueden salir mal.

Un sistema distribuido es uno en el que la falla de una computadora que ni siquiera sabía que existía puede hacer que su propia computadora quede inutilizable . -Leslie Lamport”.

Cuando quieres simular algo, necesitas saber exactamente cuál es tu objetivo. Si está intentando escribir aplicaciones que sean resistentes a las fluctuaciones de la red, es posible que desee ejecutar varias máquinas virtuales y usar reglas tc para inyectar fallas aleatorias en las interfaces virtuales. Luego puede probar si su aplicación funciona bien con esas fallas. Si está buscando probar redes, mininet será útil.

¿Por qué necesitas que esté en una computadora portátil?

Encienda tantos servidores como desee de su proveedor de servicios en la nube favorito, como Amazon Web Services (AWS), Google Compute Engine, Microsoft Azure, etc. Se facturan por hora, por lo que si no necesita que se ejecuten continuamente , puedes conseguirlos bastante baratos.

Si lo está haciendo bien (y no está tratando específicamente con cosas como la confiabilidad), ejecutar todo localmente no debería ser diferente de ejecutar diferentes componentes en diferentes servidores.

Por “hacerlo bien”, me refiero a no requerir que cada componente exija su propia dirección IP o el mismo puerto.

Escriba un programa en Go y use la transmisión de Hadoop. Instale un clúster Hadoop en modo pseudodistribuido.

Conecte máquinas virtuales a una red virtual. Espere que el rendimiento sea abismal, pero estará bien para fines de prueba.

More Interesting

¿Qué apesta en el desarrollo de software?

Cómo comenzar a contribuir en proyectos de código abierto

¿Cuáles son algunas de las formas de obtener una pasantía de desarrollador de software pagado en Alemania?

Cómo obtener experiencia en sistemas distribuidos si no puedo conseguir un trabajo cerca de este dominio

¿Cuál es el uso de la hoja de datos para desarrolladores de software incorporado?

Para un desarrollador de software establecido, ¿hay algún punto en ir a la universidad?

¿Cuáles son las cosas que un desarrollador de software debe saber aparte de los lenguajes de programación?

¿Por qué la vida es tan difícil ya que no importa cuánto aprenda, todavía no puedo convertirme en un buen desarrollador de software?

¿Es un Chromebook bueno para los desarrolladores?

Trabajo como analista financiero para un banco. Estoy interesado en hacer un cambio de carrera y convertirme en desarrollador de software. Si me enseño a codificar con cursos en línea, ¿cuánto tiempo hasta que una empresa de tecnología pueda emplearme como desarrollador?

¿Qué compañías tienen una cantidad significativa de base de código C ++?

¿Puedes crecer como ingeniero de back-end con Ruby on Rails?

Para un joven estudiante de CS, ¿valdría la pena invertir tiempo en aprender Emacs y / o Vim, o debería apegarme a Sublime Text o Atom?

Quiero convertirme en el mejor desarrollador front-end. Entonces, ¿cuál es la mejor manera de comenzar?

¿Necesitas un título para ser desarrollador de software? ¿Cuál es la diferencia entre los desarrolladores autodidactas y los que tienen títulos?