Celui qui ne sait pas d'où il vient
ne peut savoir où il va.
Antonio Gramsci
{firstname:'Stéphane' , lastname : 'Michel', job: 'Software Craftsman'}
© Stéphane Michel
backend : Partie serveur d'une architecture logicielle
Opposée à frontend (partie cliente / interface graphique)
Y sont déportés les traitements lourds / métiers et les données
Performances
Capacité de montée en charge (scalability)
Stockage
Gros volumes (To, Po)
Tolérence aux pannes (disques RAID 2 et +)
Clusterisation
Load balancing
Sauvegarde centralisée
Bref, un truc 100% disponible !
Le premier ordinateur : ENIAC en 1945
30 tonnes, 167 m2
Système centralisé (mainframe) et terminaux passifs
Utilisation des ressources optimale (1 serveur unique, très cher et très volumineux)
Terminaux passifs : ergonomie /possibilités faibles
Nombreux clients simultanés (jusqu'à plusieurs milliers pour les plus performants)
Normalisation des OS (UNIX) et des architectures et des langages (C)
Amélioration considérable de l'ergonomie (interfaces graphiques, fenêtres, etc.)
Montée en puissance des ordinateurs personnels
C'était bien, mais surtout pour travailler dans son coin (architecture 1 tiers)
Pour travailler à plusieurs on reste sur du mainframe
Et on a eu envie d'interconnecter tout ça...
Des serveurs puissants, des clients avec des interfaces graphiques.
Surtout qu'on disposait d'une technologie réseau déjà efficace : TCP/IP
Ainsi est né le client / serveur !
Client
Client
Client
BDD
Présentation et traitements
Données voire traitements (procédures stockées, argh !)
Partage de l'information : 1 seule BDD (éventuellement en cluster)
Stockage centralisé et transactionnel (ACID)
Présentation
Traitements métiers
Données
Client Web
Client Mobile
Client Desktop
Mail Server
Client Web
Client Mobile
Client Desktop
Frontal / Gateway / ESB
Mail Server
-> nécessite du personnel bien formés
(alors va pas falloir dormir...)
Tout est possible à partir du moment où il y a du réseau...
Vous en connaissez plein...
YouTube, instagram, Amazon,... bref la quasi totalité du web...
Gateway / Frontal
BDD Order
Mail Server
Client Web
Client Mobile
Client Desktop
Order µservice
BDD Products
Products µservice
BDD Users
Users µservice
C'est un avant goût, pour le détail il faudra attendre le cours de Benoît...
Java (JavaFX/OpenJFX, Swing (commence à dater...), Eclipse RCP), .Net (WPF, Windows Forms, UWP), MacOS/XCode (Cocoa, Objective-C/Swift), Android SDK, Unity, QT...
Avantages :
Performances
On peut quasi tout faire
Inconvénients :
Rarement multi-plateforme
Complexité
Coût (temps et parfois argent)
Ecosystème monolithique (difficile d'en sortir)
Le livrable est un exécutable
HTML5/CSS/JavaScript
(React.js, Angular, Vue.js, Progressive WebApp)
Avantages :
Basé sur des standards
Libertés des outils
Suffit dans 80% des cas
Si backend node.js on a une fullstack Javascript (moins de techno à maîtriser)...
Inconvénients :
Souvent moins veloce que du natif (mais ca se rapproche (WebAssembly))
Compliqué d'intégrer des composants externes non web.
Interfaçage avec le poste local
Difficultés de validation (multi browser)
Grosse activité depuis 3/4 ans poussée par des gros acteurs (Microsoft, Google) et le monde open source.
Deux ou trois solutions devraient émerger (lesquelles ?)
(Google)
(.net)
là c'est simple, 1 choix s'impose :
HTTP(s)
Avec parfois en complément
WebSocket : pour les aspects push du serveur vers les clients (mais plutôt en intranet, car ne passe pas tous les firewall).
Pour des architectures plus exotiques (matériel embarqué, absence de pile HTTP), communications
basées sur TCP : RPC, RMI (Java), CORBA, DCOM (Microsoft, on n'en parle plus), socket directe...
Couche n°5 (session) du modèle OSI
IIS / ASP.Net Core
Liste non exhaustive et on se limite aux serveurs Web
File system : le niveau 0 du stockage ! Mais peut suffire si les besoins sont simple et en lecture seule
SGBDr (Oracle, MySQL, PostgreSQL, SQL Server, SQLite3, etc.) : transactionnel, ACID.
SGBD no SQL (CouchDB, MongoDB, Cassandra, Redis, ElasticSearch et des dizaines d'autres...) en plein boom...
SGBD objets (le buzz il y a 15 ans)
Source ici
The architecture of a software system is the shape given to that system by those who build it.
The form of that shape is in the division of that system into components, the arrangement of those components, and the ways in wish those components communicates with each other.
The purpose of that shape is to facilitate the development, deployment, operations, and maintenance of the software system contained within it.
Robert C. Martin "Clean Architecture"
LA solution n'existe pas
Tout est affaire de compromis
C'est le job de l'architecte logiciel
And so I learned that great architecture sometimes lead to great failures.
Architecture must be flexible enough to adapt to the size of the problem.
Architecting for the enterprise, when all you really need is a cute little desktop tool, is a recipe of failure.
Robert C. Martin "Clean Architecture" (p 374)
Non exhaustifs et pas nécessairement impartiaux
L'existant : quelles technos sont déjà utilisées / maîtrisées
L'équipe : expérience, profil (moteur / suiveur), motivation, aspirations, taille (on ne fait pas la même archi pour une équipe de 5 et une équipe de 20)
Non exhaustifs et pas nécessairement impartiaux
Type de projet : Prototype, R&D ou production
Délais : pour dans 2 mois ou pour dans 2 ans...
Budget : en temps et en argent...
Méthode : en V, agile...
Non exhaustifs et pas nécessairement impartiaux
Futur : vers où on a envie d'aller, en quelles techno on croit
Expérience: retours sur R&D ou prototypes ou projets passés.
Réutilisation : souhait de réutiliser des briques déjà existantes dans l'entreprise
Non exhaustifs et pas nécessairement impartiaux
Confidentialité : niveau de sensibilité des données (adapté au cloud ou pas ?)
Criticité : domaine militaire ou pas, critique dès la phase de développement (réseau confidentiel défense par exemple).
Non exhaustifs et pas nécessairement impartiaux
Outillage: IDE, facilité à mettre en place l'environnement de développement
Productivité: facilité de développement
Technologie: richesse de l'ecosystème, langage, frameworks, adéquation avec le besoin
Communauté: facilité à trouver de l'aide, de la doc, des exemples, etc.
Non exhaustifs et pas nécessairement impartiaux
Architecture d'ébergement : Cloud, Docker, serveur intranet, etc.
Automatique ou piloté : Direct depuis l'intégration continue ou processus de validation préalable.
Non exhaustifs et pas nécessairement impartiaux
Performances : nombre de clients simultanés, volumes échangés, performances réseau
Tolérance aux pannes : capacité à supporter des crash
Scalabilité : capacité à supporter les montées en charge
Non exhaustifs et pas nécessairement impartiaux
Maintenabilité : intégration continue, facilité de réalisation des tests
Feedback : log, retours sur l'utilisation et sur les crashs
Language | Threads vs. Processes | Non-blocking I/O | Ease of Use |
---|---|---|---|
PHP | Processes | No | |
Java | Threads | Available | Requires Callbacks |
Node.js | Threads | Yes | Requires Callbacks |
Go | Threads (Goroutines) | Yes | No Callbacks Needed |
Non exhaustifs et pas nécessairement impartiaux non plus
Se documenter : rester toujours curieux sur tous les sujets (livres, site technologiques, blog, salons/conférences, etc.)
Mais lors du choix : rester dans le mainstream : trop de techno disparaissent faute d'avoir trouver un public. Pensez à ceux (peut être vous) qui devront maintenir l'appli dans les années à venir
Rester critique : toujours vérifier une info, testez, faite vous votre propre opinion
Prototyper : avant de se lancer vers l'inconnu, on teste à petite échelle
Savoir se remettre en cause : les choix d'hier ne sont pas nécessairement adaptés à demain
Le client souhaite faire une appli métier de gestion dans son intranet. Cette appli sous Windows doit pouvoir intégrer des composants graphiques "maison" faits en C++. Le tout sera utilisé par une dizaine de personnes. Ils ont déjà des compétences backend en J2EE. Il stocke actuellement ses données dans une BDD PostgreSQL. Le budget est limité...
On ne fait pas la révolution :
On conserve la BDD
On propose quand même du node.js côté backend au cas où car ce serait moins coûteux
Côté client, les techno web ne vont pas aller (composant C++) ca sent le client lourd en WPF / ou UWP ou QT...
Le client souhaite faire une appli métier de gestion dans son intranet. Cette appli sous Windows doit pouvoir intégrer des composants graphiques "maison" faits en C++. Le tout sera utilisé par une dizaine de personnes. Ils ont déjà des compétences backend en J2EE. Il stocke actuellement ses données dans une BDD PostgreSQL. Le budget est limité...
Le client souhaite refaire une appli métier de gestion pour ses collaborateurs répartis dans le monde entier car la version actuelle ne tient plus la charge. Cette appli pourra être utilisée par des milliers de personnes. Les données ne sont pas "sensibles". Ils ont déjà des compétences backend IIS. Il stocke actuellement ses données dans une BDD SQL Server sur leur site principal. Le budget est important...
Là on peut faire la révolution (au moins la proposer...)
On ne conserve rien (de toute manière ça ne fonctionne pas bien)
Répartition mondiale -> le cloud peut être un bon candidat (AWS, Azure, etc.).
Par contre le choix est impactant (coût, pérennité...)
Nécessite de faire un premier prototypage.
Le client souhaite refaire une appli métier de gestion pour ses collaborateurs répartis dans le monde entier car la version actuelle ne tient plus la charge. Cette appli pourra être utilisée par des milliers de personnes. Les données ne sont pas "sensibles". Ils ont déjà des compétences backend IIS. Il stocke actuellement ses données dans une BDD SQL Server sur leur site principal. Le budget est important...
Le client souhaite refaire une appli métier de gestion dans un browser en intranet pour son personnel. Cette appli pourra être utilisée par des centaines de salariés. Ils ont peu de compétence backend mais souhaitent pouvoir reprendre le projet à terminaison. Ils stockent actuellement leurs données dans une BDD Oracle (qui leur coûte un bras) sur leur site principal. Le budget est confortable...
Là on peut se faire plaisir et faire plaisir au client en même temps :
Client : React / Angular ou Vue.js
Serveur node.js Stateless
Etude du remplaçement de la BDD Oracle par une BDD PostgreSQL (si on reste en relationnel) voire suivant les cas une BDD nosql (analyse approfondie à faire)
Le client souhaite refaire une appli métier de gestion dans un browser en intranet pour son personnel. Cette appli pourra être utilisée par des centaines de salariés. Ils ont peu de compétence backend mais souhaitent pouvoir reprendre le projet à terminaison. Ils stockent actuellement leurs données dans une BDD Oracle (qui leur coûte un bras) sur leur site principal. Le budget est confortable...
On choisit sa technologie front-end en fonction de la technologie back-end ?
Word est une application avec une architecture 2 tiers !
Skype est une application avec une architecture n-tier !
Le back-end est la partie visible de l'application ?
Une appli est scalable si elle supporte le crash d'un de ses composant
Une appli tolérante aux panne supporte les montées en charge !
Faire un test de montée en charge sur une appli consiste à simuler un grand nombre de requêtes et de clients !
C'est uniquement l'expertise technique qui drive les choix d'architecture !