|
| 1 | +--- |
| 2 | +layout: page |
| 3 | +title: Contrats de communication inter-features |
| 4 | +permalink: /microservices-contrats/ |
| 5 | +page_content_classes: table-container |
| 6 | +--- |
| 7 | + |
| 8 | +**Projet :** Avenirs-ESR / ePortfolio. <br/> |
| 9 | +**Objet :** Contrats de communication inter-features — Préparation microservices.<br/> |
| 10 | +<br/> |
| 11 | +**Révision :** 1.0.0<br/> |
| 12 | +**Date :** 03/04/2026<br/> |
| 13 | + |
| 14 | + |
| 15 | +## Stratégie de communication |
| 16 | + |
| 17 | +Ce document liste l'ensemble des communications inter-features du projet. Chaque appel est classifié selon le type de communication le plus adapté au cas d'usage. |
| 18 | + |
| 19 | +### Comparatif REST / gRPC / Kafka |
| 20 | + |
| 21 | +| **Critère** | **REST** | **gRPC** | **Kafka** | |
| 22 | +|----------------|--------------------------------------------|---------------------------------------------|----------------------------------------------| |
| 23 | +| Protocole | HTTP/1.1 + JSON | HTTP/2 + Protobuf (binaire) | Événements asynchrones | |
| 24 | +| Latence | Modérée | Faible (5-10x plus rapide) | Variable (ms à sec) | |
| 25 | +| Couplage | Synchrone, couplage temporel | Synchrone, couplage temporel | Asynchrone, découplé | |
| 26 | +| Outillage | Swagger/OpenAPI, curl, navigateur | Fichiers .proto, génération de clients | Kafka UI, Schema Registry | |
| 27 | +| Cas d'usage | Lectures, validations, CRUD classique | Haute performance, streaming | Notifications, side-effects, fan-out | |
| 28 | +| Complexité | Faible (Spring Boot natif) | Moyenne (proto, codegen) | Moyenne (broker, topics, consumers) | |
| 29 | + |
| 30 | +<br/> |
| 31 | +**Choix pour ce projet :** REST pour les appels synchrones (l'appelant a besoin de la réponse), Kafka pour les side-effects asynchrones (notifications, initialisations en cascade). gRPC n'est pas retenu car les volumes d'appels ne justifient pas la complexité supplémentaire. |
| 32 | + |
| 33 | +### Règle de décision |
| 34 | + |
| 35 | +- **REST :** l'appelant a besoin du résultat pour continuer (lecture de données, validation, vérification d'existence). |
| 36 | +- **Kafka :** l'appelant n'attend pas de réponse, il notifie qu'un fait s'est produit (création, suppression, nettoyage en cascade). |
| 37 | + |
| 38 | +## Matrice des communications inter-features |
| 39 | + |
| 40 | +Le tableau ci-dessous répertorie chaque appel cross-feature, la méthode invoquée, le type de communication retenu et une note explicative. |
| 41 | + |
| 42 | +### AMS |
| 43 | + |
| 44 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 45 | +|--------------------|--------------------|--------------------------------------------------|----------|----------------------------------------| |
| 46 | +| ams | trace | `getTracesLinkedWithAMS(ams)` | REST | Besoin du count pour l'affichage | |
| 47 | +| ams | student.imported | `getSkillLevelProgressesLinkedWithAMS(ams)` | REST | Besoin du count pour l'affichage | |
| 48 | +<br/> |
| 49 | + |
| 50 | +### Activity |
| 51 | + |
| 52 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 53 | +|--------------------|--------------------|--------------------------------------------------|----------|----------------------------------------| |
| 54 | +| activity | student.declared | `getByActivity(activity)` | REST | Vérifier si l'étudiant est inscrit | |
| 55 | +| activity | student.declared | `getAllDeclaredActivitiesOf(student)` | REST | Lister les inscriptions pour affichage | |
| 56 | +| activity | file | `getActivityBanner(activity)` | REST | Récupérer l'image bannière | |
| 57 | +<br/> |
| 58 | + |
| 59 | +### Student — Declared Activity |
| 60 | + |
| 61 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 62 | +|---------------------|-------------------|--------------------------------------------------|----------|------------------------------------------| |
| 63 | +| student.decl.act | activity | `getActivityById(activityId)` | REST | Valider l'existence avant inscription | |
| 64 | +| student.decl.act | trace | `findAllTracesById(traceIds)` | REST | Récupérer les traces pour association | |
| 65 | +| student.decl.act | trace | `getTracesView(...)` | REST | Recherche paginée pour l'UI | |
| 66 | +| student.decl.act | association | `createAll / getAllOf / deleteAllByIds` | REST | Gestion des associations trace-activité | |
| 67 | +<br/> |
| 68 | + |
| 69 | +### Student — Declared Skill Progress |
| 70 | + |
| 71 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 72 | +|---------------------|-------------------|--------------------------------------------------|----------|------------------------------------------| |
| 73 | +| student.decl.skill | trace | `getTracesLinkedWithDeclaredSkillProgress(...)` | REST | Afficher les traces liées | |
| 74 | +| student.decl.skill | trace | `programNameOfTrace(trace)` | REST | Afficher le nom du programme | |
| 75 | +| student.decl.skill | trace | `unassociateTraces(...)` | REST | Désassocier avant suppression | |
| 76 | +| student.decl.skill | declaredskill | `getOrCreateFromExternalSkill(...)` | REST | Sync compétence externe | |
| 77 | +<br/> |
| 78 | + |
| 79 | +### Student — Declared Experience |
| 80 | + |
| 81 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 82 | +|---------------------|-------------------|--------------------------------------------------|----------|------------------------------------------| |
| 83 | +| student.decl.exp | user | `getStudentById(studentId)` | REST | Récupérer le Student pour création | |
| 84 | +<br/> |
| 85 | + |
| 86 | +### Student — Declared Program |
| 87 | + |
| 88 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 89 | +|---------------------|-------------------|--------------------------------------------------|----------|------------------------------------------| |
| 90 | +| student.decl.prog | user | `getStudentById(studentId)` | REST | Récupérer le Student pour création | |
| 91 | +<br/> |
| 92 | + |
| 93 | +### Student — Imported Progress |
| 94 | + |
| 95 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 96 | +|---------------------|-------------------|--------------------------------------------------|----------|------------------------------------------| |
| 97 | +| student.imported | trace | `getTracesLinkedWithSkillLevelProgress(...)` | REST | Comptage traces par compétence | |
| 98 | +<br/> |
| 99 | + |
| 100 | +### Self-Knowledge |
| 101 | + |
| 102 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 103 | +|--------------------|--------------------|--------------------------------------------------|----------|------------------------------------------| |
| 104 | +| selfknowledge | user | `addSelfKnowledgeCategories(student, cats)` | REST | Ajout catégories au student | |
| 105 | +| selfknowledge | user | `removeSelfKnowledgeCategory(student, cat)` | REST | Retrait catégorie du student | |
| 106 | +<br/> |
| 107 | + |
| 108 | +### Trace |
| 109 | + |
| 110 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 111 | +|--------------------|--------------------|-----------------------------------------------------|----------|------------------------------------------| |
| 112 | +| trace | user | `getUser(userId)` | REST | Récupérer le User pour création de trace | |
| 113 | +| trace | student.imported | `findStudentProgressesBySkillLevelProgresses(...)` | REST | Déterminer le nom du programme | |
| 114 | +| trace | file | `findByTrace(trace)` | REST | Récupérer les pièces jointes | |
| 115 | +| trace | student.decl.act | `findAllDeclaredActivitiesByIds(...)` | REST | Récupérer activités pour associations | |
| 116 | +| trace | student.decl.act | `findAllNotCompletedActivitiesByIds(...)` | REST | Filtrer activités non terminées | |
| 117 | +| trace | student.decl.act | `searchDeclaredActivity(keyword, page)` | REST | Recherche paginée pour association | |
| 118 | +| trace | student.decl.skill | `findAllDeclaredSkillProgressesByIds(...)` | REST | Récupérer skills pour associations | |
| 119 | +| trace | student.decl.skill | `searchDeclaredSkill(keyword, page)` | REST | Recherche paginée pour association | |
| 120 | +| trace | association | `getAllOf / createAll / deleteAllByIds` | REST | Gestion des associations | |
| 121 | +<br/> |
| 122 | + |
| 123 | +### File |
| 124 | + |
| 125 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 126 | +|--------------------|-------------------|--------------------------------------------------|----------|------------------------------------------| |
| 127 | +| file | trace | `getTraceById(traceId)` | REST | Valider l'existence de la trace | |
| 128 | +| file | trace | `deleteById(traceId)` | REST | Supprimer trace si upload échoue | |
| 129 | +<br/> |
| 130 | + |
| 131 | +### Program |
| 132 | + |
| 133 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 134 | +|--------------------|--------------------|--------------------------------------------------|----------|------------------------------------------| |
| 135 | +| program | student.imported | `findAllStudentProgressesByStudent(student)` | REST | Config institution via les parcours | |
| 136 | +<br/> |
| 137 | + |
| 138 | +### Shared |
| 139 | + |
| 140 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 141 | +|--------------------|-------------------|--------------------------------------------------|----------|------------------------------------------| |
| 142 | +| shared | user | `getStudentById(userId)` | REST | Récupérer le student connecté | |
| 143 | +<br/> |
| 144 | + |
| 145 | +### User |
| 146 | + |
| 147 | +| **Feature source** | **Feature cible** | **Méthode appelée** | **Type** | **Justification** | |
| 148 | +|--------------------|-------------------|--------------------------------------------------|----------|------------------------------------------| |
| 149 | +| user | file | `getUserPhotoUrl(...)` | REST | Récupérer les URLs photos | |
| 150 | +<br/> |
| 151 | + |
| 152 | +### Événements asynchrones (Kafka) — candidats |
| 153 | + |
| 154 | +| **Feature source** | **Feature cible** | **Événement / Méthode** | **Type** | **Justification** | |
| 155 | +|---------------------|-------------------|------------------------------------------------------------------|----------|--------------------------------------------------------| |
| 156 | +| user | selfknowledge | `StudentCreated` → `initSelfKnowledgeCategoriesMandatory` | Kafka | Side-effect : init catégories après création étudiant | |
| 157 | +| student.decl.skill | trace | `DeclaredSkillDeleted` → `unassociateTraces` | Kafka | Side-effect : nettoyage associations après suppression | |
| 158 | +<br/> |
| 159 | + |
| 160 | +## Synthèse |
| 161 | + |
| 162 | +### Récapitulatif |
| 163 | + |
| 164 | +- **30 appels REST synchrones** — l'appelant a besoin de la réponse immédiatement. |
| 165 | +- **2 événements Kafka asynchrones** — side-effects de type « fire and forget ». |
| 166 | +- **0 appel gRPC** — non retenu, volumes insuffisants pour justifier la complexité. |
| 167 | + |
| 168 | +### Feature la plus couplée : Trace |
| 169 | + |
| 170 | +Le service Trace est le plus interconnecté : il dépend de 6 autres features (user, student.imported, file, student.declared.activity, student.declared.skill, association) et 5 features dépendent de lui. C'est le dernier service à extraire en microservice. |
| 171 | + |
| 172 | +### Ordre d'extraction suggéré |
| 173 | + |
| 174 | +En partant des features les moins couplées vers les plus couplées : |
| 175 | + |
| 176 | +1. **association** — aucune dépendance sortante |
| 177 | +2. **selfknowledge** — dépend uniquement de user |
| 178 | +3. **program** — dépend uniquement de student.imported |
| 179 | +4. **file** — dépend de trace (1 service) |
| 180 | +5. **ams** — dépend de trace et student.imported |
| 181 | +6. **user** — dépend de file et selfknowledge |
| 182 | +7. **student.*** — sous-features declared et imported, dépendent de activity, trace, user |
| 183 | +8. **activity** — dépend de student.declared et file |
| 184 | +9. **trace** — le plus couplé, extraire en dernier |
0 commit comments