4NK_node/specs/spec-technique.md
Nicolas Cantu 72682290c1 feat: Ajout du support des relais externes et intégration dev3.4nkweb.com
- Ajout du script add_external_node.sh pour gérer les nœuds externes
- Configuration external_nodes.conf avec dev3-relay
- Scripts de test pour dev3.4nkweb.com (connectivité WSS)
- Documentation complète (CONFIGURATION_DEV3.md, RESUME_AJOUT_DEV3.md)
- Scripts de test de synchronisation et monitoring
- Configuration multi-relais avec 3 instances
- Mise à jour de la documentation technique et fonctionnelle
- Scripts de démarrage et monitoring pour les 3 relais
2025-08-22 17:00:31 +02:00

283 lines
7.2 KiB
Markdown

# Spécification Technique - Synchronisation entre Relais
## Vue d'ensemble
Cette spécification décrit l'implémentation de la synchronisation entre relais dans le réseau 4NK, permettant la communication et le partage de données entre plusieurs instances de `sdk_relay`.
## Architecture de Synchronisation
### 1. Gestionnaire de Synchronisation (`SyncManager`)
Le `SyncManager` est le composant central qui gère toute la logique de synchronisation :
```rust
pub struct SyncManager {
relay_id: String,
sequence_counter: Arc<Mutex<u64>>,
sync_cache: Arc<Mutex<HashMap<String, Instant>>>,
last_sync: Arc<Mutex<HashMap<SyncType, u64>>>,
mesh_connections: Arc<Mutex<HashMap<String, MeshConnection>>>,
known_relays: Arc<Mutex<HashMap<String, RelayInfo>>>,
metrics: Arc<Mutex<SyncMetrics>>,
}
```
### 2. Types de Synchronisation
Les types de synchronisation supportés :
- **StateSync** : Synchronisation de l'état général du relais
- **ProcessSync** : Synchronisation des processus en cours
- **MemberSync** : Synchronisation des membres
- **TxSync** : Synchronisation des transactions
- **BlockSync** : Synchronisation des blocs
- **PeerSync** : Synchronisation des pairs connectés
- **RelaySync** : Synchronisation des informations des relais
- **HealthSync** : Synchronisation de la santé du relais
- **MetricsSync** : Synchronisation des métriques
- **ConfigSync** : Synchronisation de la configuration
- **CapabilitySync** : Synchronisation des capacités
### 3. Messages de Synchronisation
#### Structure des Messages
```rust
pub struct SyncMessage {
pub sync_type: SyncType,
pub relay_id: String,
pub sequence: u64,
pub timestamp: u64,
pub payload: SyncPayload,
}
```
#### Types de Payload
```rust
pub enum SyncPayload {
StateData { state: String, version: String },
ProcessData { processes: HashMap<String, String> },
MemberData { members: HashMap<String, String> },
HealthData { status: HealthStatus, uptime: u64, cpu_usage: f64 },
MetricsData { metrics: SyncMetrics },
PeerData { peers: Vec<PeerInfo>, last_seen: u64 },
RelayData { relays: Vec<RelayInfo>, network_topology: NetworkTopology },
}
```
## Fonctionnalités Implémentées
### 1. Découverte Automatique des Relais
Le système implémente une découverte automatique des relais dans le réseau :
```rust
pub async fn discover_relays(&self) -> Result<()> {
let relay_hosts = vec![
"sdk_relay_1",
"sdk_relay_2",
"sdk_relay_3",
];
for host in relay_hosts {
if host == self.relay_id {
continue; // Ignorer soi-même
}
let relay_info = RelayInfo {
relay_id: host.to_string(),
address: format!("{}:8090", host),
// ... autres champs
};
self.add_relay(relay_info)?;
}
Ok(())
}
```
### 2. Cache de Déduplication
Pour éviter les doublons, un cache de déduplication est implémenté :
```rust
pub struct MessageCache {
cache: Arc<Mutex<HashMap<String, Instant>>>,
}
impl MessageCache {
pub fn is_duplicate(&self, message_id: &str) -> bool {
let mut cache = self.cache.lock().unwrap();
if cache.contains_key(message_id) {
true
} else {
cache.insert(message_id.to_string(), Instant::now());
false
}
}
}
```
### 3. Synchronisation Périodique
Le système effectue une synchronisation périodique :
- **Synchronisation d'état** : Toutes les 30 secondes
- **Synchronisation de santé** : Toutes les 60 secondes
- **Synchronisation de métriques** : Toutes les 120 secondes
- **Synchronisation des relais** : Toutes les 300 secondes (5 minutes)
### 4. Gestion des Connexions Mesh
```rust
pub struct MeshConnection {
pub relay_id: String,
pub address: String,
pub connected_since: u64,
pub last_heartbeat: u64,
pub status: ConnectionStatus,
}
```
## Configuration Multi-Relais
### Configuration Docker
Le système supporte la configuration de plusieurs relais via Docker :
```yaml
services:
sdk_relay_1:
container_name: sdk_relay_1
ports:
- "8090:8090"
- "8091:8091"
environment:
- ENABLE_SYNC_TEST=1
sdk_relay_2:
container_name: sdk_relay_2
ports:
- "8092:8090"
- "8093:8091"
environment:
- ENABLE_SYNC_TEST=1
sdk_relay_3:
container_name: sdk_relay_3
ports:
- "8094:8090"
- "8095:8091"
environment:
- ENABLE_SYNC_TEST=1
```
### Configuration par Relais
Chaque relais a sa propre configuration :
```ini
# .conf.docker.relay1
relay_id=relay-1
ws_url=0.0.0.0:8090
# .conf.docker.relay2
relay_id=relay-2
ws_url=0.0.0.0:8090
# .conf.docker.relay3
relay_id=relay-3
ws_url=0.0.0.0:8090
```
## Métriques de Synchronisation
```rust
pub struct SyncMetrics {
pub messages_sent: u64,
pub messages_received: u64,
pub sync_requests: u64,
pub sync_responses: u64,
pub errors: u64,
pub last_sync: u64,
pub avg_latency: f64,
}
```
## Sécurité et Validation
### 1. Validation des Messages
- Vérification de l'ID du relais émetteur
- Validation du timestamp pour éviter les attaques par rejeu
- Vérification de la séquence pour détecter les messages manquants
### 2. Déduplication
- Cache des messages reçus avec TTL
- Nettoyage automatique du cache toutes les 5 minutes
- Prévention des boucles de synchronisation
## Tests et Validation
### Script de Test
Un script de test automatisé est fourni :
```bash
#!/bin/bash
# test_3_relays.sh
echo "🚀 Test de synchronisation avec 3 relais"
echo "========================================"
# Démarrage des services
docker-compose up -d tor bitcoin blindbit
sleep 30
# Démarrage des 3 relais
docker-compose up -d sdk_relay_1 sdk_relay_2 sdk_relay_3
sleep 60
# Surveillance des logs
docker-compose logs -f sdk_relay_1 sdk_relay_2 sdk_relay_3
```
### Validation des Fonctionnalités
1. **Découverte automatique** : Les relais se découvrent mutuellement
2. **Partage des listes** : Les relais partagent leurs listes de relais connus
3. **Synchronisation d'état** : Les états sont synchronisés périodiquement
4. **Métriques** : Les métriques sont collectées et partagées
5. **Santé** : Le statut de santé est surveillé et partagé
## Prochaines Étapes
### 1. Améliorations Planifiées
- [ ] Implémentation de la signature des messages
- [ ] Optimisation des performances pour de gros volumes
- [ ] Implémentation de la fusion des données entre relais
- [ ] Ajout de la compression des messages
### 2. Fonctionnalités Avancées
- [ ] Routage intelligent des messages
- [ ] Gestion de la tolérance aux pannes
- [ ] Synchronisation différentielle
- [ ] Monitoring en temps réel
### 3. Tests Avancés
- [ ] Tests de charge avec de nombreux relais
- [ ] Tests de résilience (arrêt/redémarrage de relais)
- [ ] Tests de sécurité (messages malveillants)
- [ ] Tests de performance (latence, débit)
## Conclusion
L'implémentation de la synchronisation entre relais fournit une base solide pour la communication distribuée dans le réseau 4NK. Le système est conçu pour être extensible, sécurisé et performant, permettant une croissance future du réseau tout en maintenant la cohérence des données.