1. Ctrl + q : Ouvrir/fermer le panel de question
Gestion du traffic HTTP

Load Balancing

							%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%%
							graph LR
							User -->|Requête 1,2,3| LoadBalancer
							LoadBalancer -->|Requête 1| Server1
							LoadBalancer -->|Requête 2| Server2
							LoadBalancer -->|Requête 3| Server3						  

Load Balancing : Gestion des down

							%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%%
							graph LR

							%%classDef
							classDef classAlert fill:red,color:white,stroke-width:2px,stroke:darkRed;
							%%flowchart

							User -->|Requête 1,2,3| LoadBalancer
							LoadBalancer -->|Requête 1| Server1
							LoadBalancer -->|Requête 2,3| Server2
							LoadBalancer -->| | Server3
							%%Style
							class Server3 classAlert;
					

Liste des Load Balancers

  • HAProxy - OpenSource
  • Seesaw - OpenSource
  • F5 - Propriétaire
  • Barracuda - Propriétaire
  • ...

Reverse Proxy

							%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%%
							graph LR
							User -->|http://h1.com\nhttp://h2.com\nhttp://h2.com/api\ndddd|Reverse[Reverse Proxy]
							Reverse -->|http://h1.com| SiteVi[Site Vitrine]
							Reverse -->|http://h2.com| Front
							Reverse -->|http://h2.com/api| BackEnd
						

Liste des Reverse Proxy

  • Nginx
  • Traefik
  • Apache
  • ....

Load Balancing Vs Reverse Proxy

C'est quoi la difference ?

  • En general les LB font RP et les RP font LB mais les objectifs sont differents
  • Les RP c'est pour répondre aux préoccupations des DEV (Architure de l'application)
  • Les LB c'est pour répondre aux préoccupations des OPS (Monter en charge/Downtime)

Les autres Features

  • Gestion de certificats (Https)
  • Gestion de l'authentification
Base de données

Les differents type de bdd

  • Relationnel
  • Document
  • Colonne
  • Cle Valeur
  • Timeseries
  • (Object Storage)

BDD Relationnel

Avantage Inconvenient
Structuré
Versionnable Recherche limité
Transactionnel
Support

Liste de SGBD Relationnel

  • Postresql
  • MySql - MariaDB
  • Oracle (Propriétaire)
  • ...

BDD Document

Avantage Inconvenient
Flexibilité de schéma Peu de Support Acid/Transaction
Modélisation des données Limitation dans les jointures
Scalabilité Manque de support
Recherche avancées

Liste de Bdd Document

  • MongoDB
  • Elasticsearch
  • CouchDB
  • ...

BDD Colonne

Avantage Inconvenient
Performance Compliqué
Répartition Spatial Peu support des transactions/ACID

Liste de Bdd Colonne

  • BigTable
  • HBase
  • Cassandra
  • ...

BDD Clé valeur

Avantage Inconvenient
Performance Pas de Recherche
Simple à utiliser Pas de transactions
Scalable Pas de jointures
Stockage en memoire RAM

Liste de Bdd Cle valeur

  • Etcd
  • Redis
  • ...

BDD Timeseries

Avantage Inconvenient
Compression Tres specialisé
Scalabilité Pas de transactions
Performance

Liste de Bdd Timeseries

  • Influx
  • Prometheus
  • Graphite
  • ...

L'object Storage

  • Stockage de fichier
  • Stockage de blob
Nommé aussi bucket

Liste d'object Storage

  • S3 (aka bucket S3)
  • Minio (S3 self-hosted)
  • Google Cloud Storage
  • ...

Question : Pour une application avec peu de traffic, beaucoup de regle metier et qui aura besoin d'une recherche assez souple qu'elle est le meilleur type de SGBD ?

Responses: 0

, relationnel, document, colonne, valeur , 0, 0, 0, 0
							%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%%
							graph LR
							ServiceCompta --> |sql |Relationnel[(Relationnel)]
							ServiceCompta --> |event | ServiceRecherche
							ServiceRecherche --> |document| Document[(Document)] 
						
							%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%%
							graph LR
							ServiceCompta --> |sql |RelationnelCompta[(RelationnelCompta)]
							ServiceClient --> |sql |RelationnelClient[(RelationnelClient)]
							ServiceCompta --> |event | ServiceRecherche
							ServiceFacture --> |event | ServiceRecherche
							ServiceClient --> |event | ServiceRecherche
							ServiceRecherche --> |document| Document[(Document)] 
							ServiceFacture --> |sql |RelationnelFacture[(RelationnelFacture)]
						

Bonne pratique

  • Une base de donnée ne se partage pas (Entre application differentes)
  • Une base ca se sauvegarde
  • On utilise la bonne base pour le bon usage

Messaging

							%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%%
							graph LR
							Producer --> |client.facture.1234| Queue 
							Queue --> |client.*| ClientEventConsumer
							Queue --> |.*facture.*| FactureEventConsumer
							Queue --> |.*1234| SseEventConsumer
						

Messaging

							%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%%
							graph LR

							Producer[Producer] --> |Produit 1-40/sec  |Queue 
							Queue --> |Consume 10/sec | ClientEventConsumer
						

Liste de broker

  • AMQP - (RabbitMQ)
  • MQTT - (Mosquitto)
  • Kafka

AMQP dans spring

La dependence :

						 
						 	implementation 'org.springframework.boot:spring-boot-starter-amqp'
						
					

Configuration des queues ('Hard-way')


						
								@Configuration
								public class QueueConfiguration {
								
								    public static final String TEMPERATURE_QUEUE = "temperatureQueue";
									@Bean
								    TopicExchange appExchange() {
								        return new TopicExchange("exchange", true, false);
								    }
								
								    @Bean
								    public Queue temperatureQueue() {
								        return QueueBuilder
								                .durable(TEMPERATURE_QUEUE)
								                .quorum()
								                .build();
								    }
								
								
								    @Bean
								    public Binding temperatureBinding(
								            Queue temperatureQueue,
								            TopicExchange appExchange
								    ) {
								        return BindingBuilder.bind(temperatureQueue).to(appExchange).with("sensors.temp.#");
								    }
								}
							
						
					

Configuration du listener

						
							@Service
							public class TemperatureListener {
								...
							
							    @RabbitListener(queues = TEMPERATURE_QUEUE)
							    public void temperatureChange(String temperature) {
							        log.info("temperature {}", temperature);
							        temperatureService.receive(temperature);
							    }
								...
							}

						
					

Gestion des erreurs

Par defauts, les messages en erreurs sont rejoué à l'infini

Il est conseille de mettre en place un deadLetterQueue

Dead Letter Queue

							%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true }}}%%
							graph LR

							Producer[Producer] --> | |Queue 
							Queue -->  | ERROR | Consumer
							Queue --> | | DeadLetterQueue