Skip to content

Commit 897bf5a

Browse files
docs(1369): doc inter-features communication
1 parent 37c388e commit 897bf5a

2 files changed

Lines changed: 187 additions & 0 deletions

File tree

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
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

pages/tech_studies_and_pocs/tech_studies_and_pocs.markdown

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ order: 7000
1313
- [POC Kong](../apim-kong/){:target="_blank"}
1414
- [POC Apisix](../apim-apisix/){:target="_blank"}
1515

16+
## Microservices
17+
- [Doc inter-features communication](../microservices-contrats/){:target="_blank"}
18+
1619
## Security & Authentication
1720
- [CAS - OIDC provider](../apim-cas-oidc-provider/){:target="_blank"}
1821
- [RBAC - Intégration du contrôle d'accès](../arch-soft-specif-security-rbac-integration-experiments/){:target="_blank"}

0 commit comments

Comments
 (0)