Alumno | Padrón |
---|---|
Edgargo Francisco Saez | 104896 |
Tomás Vainstein Aranguren | 109043 |
Fabio Sicca | 104892 |
Este repositorio contiene la implementación de un sistema distribuido de ride sharing desarrollado en Rust. El sistema incluye funcionalidades de coordinación entre conductores, pasajeros y un servicio de pagos. Utiliza el modelo de actores de Actix para manejar concurrencia y comunicaciones asíncronas.
- Arquitectura Distribuida: Los componentes del sistema están diseñados para funcionar en entornos distribuidos y ser resilientes a fallas.
- Sistema de Elección de Líder (Algoritmo de Anillo): Implementa un algoritmo eficiente para manejar fallas en los nodos líderes.
- Comunicación Asíncrona: Basado en
actix
ytokio
, utiliza tareas asíncronas para operaciones concurrentes. - Gestor de Viajes: Asigna conductores a pasajeros y actualiza posiciones en tiempo real durante un viaje.
- Reconexión Automática: Los nodos intentan reconectarse de manera automática en caso de desconexión.
- Sistema de Pagos: Integra un servicio externo para procesar pagos.
- Ubicacion en Tiempo Real Los conductores van informando su ubicacion en tiempo real, manteniendo al lider informado.
Para ejecutar este proyecto necesitas:
- Rust (versión estable reciente)
- Cargo
- Tokio y Actix (ya incluidos como dependencias en el proyecto)
-
Clona este repositorio:
git clone https://github.com/usuario/proyecto-ride-sharing.git cd proyecto-ride-sharing
-
Instala las dependencias:
cargo build
-
Configura los puertos y otros parámetros en el archivo
config.txt
.
Puedes iniciar un nodo conductor con el siguiente comando:
cargo run 6001 3 3
Donde:
6001
es el puerto del conductor.3 3
son las coordenadas iniciales del conductor.
Para habilitar logs detallados (sistema de PINGS y ubicaciones de los coches en movimiento), utiliza la variable de entorno RUST_LOG
:
RUST_LOG=info cargo run 6001 3 3
Para generar la documentación:
cargo doc --open
El sistema utiliza un algoritmo de elección de líder basado en anillos. En caso de que el líder actual falle, los nodos restantes detectan la falla y eligen un nuevo líder de manera automática.
Cada nodo envía pings periódicos para verificar la disponibilidad de los demás nodos. Si un nodo no responde dentro del intervalo de tiempo definido, se considera como desconectado.
Cada conductor informa al lider su ubicacion en todo momento del viaje.
Cuando un nodo desconectado vuelve a estar disponible, intenta reconectarse automáticamente al sistema.
- Inicio de Viaje: Un pasajero solicita un viaje y el sistema asigna un conductor.
- Actualización en Tiempo Real: Durante el viaje, el sistema actualiza la posición del conductor.
- Finalización: Cuando se llega al destino, se registra la finalización del viaje y se procesa el pago.
El proyecto está dividido en los siguientes módulos:
- driver: Maneja la lógica del conductor, incluyendo actualización de posiciones y pings.
- models: Define las estructuras de datos principales como
RideRequest
,PositionUpdate
yDriverStatus
. - utils: Contiene funciones auxiliares como la lectura de configuración.
- ride_manager: Gestiona los viajes y las asignaciones de pasajeros a conductores.
Este proyecto está licenciado bajo la MIT License.