Modèles architecturaux pratiques

Bonjour, Habr!


À la lumière des événements actuels, en raison du coronavirus, un certain nombre de services Internet ont commencé à recevoir une charge accrue. Par exemple, l' une des chaînes de vente au détail au Royaume-Uni a simplement arrêté le site avec des commandes en ligne , car la capacité n'était pas suffisante. Et il est loin d'être toujours possible d'accélérer un serveur en ajoutant simplement un équipement plus puissant, cependant, les demandes des clients doivent être traitées (ou elles iront aux concurrents).


Dans cet article, je parlerai brièvement des pratiques populaires qui vous permettront de faire un service rapide et tolérant aux pannes. Cependant, parmi les schémas de développement possibles, je n'ai sélectionné que ceux qui sont maintenant faciles à utiliser . Pour chaque élément, vous disposez soit de bibliothèques prêtes à l'emploi, soit vous pouvez résoudre le problème à l'aide de la plateforme cloud.


Mise à l'échelle horizontale


L'article le plus simple et le plus connu. Par convention, les plus courants sont deux schémas d'équilibrage de charge - mise à l'échelle horizontale et verticale. Dans le premier cas, vous autorisez les services à fonctionner en parallèle, répartissant ainsi la charge entre eux. Dans le second, vous commandez des serveurs plus puissants ou optimisez le code.


Pour un exemple, je vais prendre un stockage de fichiers cloud abstrait, c'est-à-dire un analogue de OwnCloud, OneDrive et ainsi de suite.


L'image standard d'un tel schéma est ci-dessous, cependant, elle ne fait que démontrer la complexité du système. Après tout, nous devons en quelque sorte synchroniser les services. Que se passe-t-il si un utilisateur enregistre un fichier à partir d'une tablette et souhaite ensuite le regarder à partir d'un téléphone?



: , — , .


CQRS


Command Query Responsibility Segregation , , . , ( ) . : . , A, .


— ( ) . - :


  1. .
  2. .
  3. .

, 2 ( , , ). , . CQRS, :


  1. .
  2. .
  3. « ».
  4. «1».


, . , request-response . , . , (, ), , .


, ( 100%) , , , .


, ( RX ). , , . .


, , . , , .


Event Sourcing


, , . ( ), , . , , — .


— , . , . eventual consistency, , - (« ») .


, , ( , ). - , — .


. eventual consistency, .



:


  • .
  • .
  • ( ).
  • "append only". .
  • FIFO ( ). , .

, . , , :



, . . : , .


(, , ):



:


  • . . , .
  • , . , «», . , , .
  • , . 1% , (. ), , .

:



, Event Sourcing CQRS. , , , , , . , . , , «», , « ». , , (, ). « ».


:


  • : « » : « » « ». , ( , ).
  • - , , , . : request-response, , . , , . : .

Sharding


, event sourcing . - . , :


  • . , / .
  • . - ,


, . , , , . « » , , , , :


  • Event Source ( — ). — id .
  • , ( — , , — , ). , , .
  • ( ).
  • (.. ), .

, , . eventual constistency, , (, , ). , , .


, , :


  • , . .
  • . , Enterprise ( ). sharding . , (, Azure self hosted).
  • — . ( ). — , . , .. , .

Static Content Hosting


, - . : , , , . , ( nginx , , Java-). CDN (Content Delivery Network) , .


— . — , CDN , .


- . ( ), . — , ( ), . — ( , , ) , -. , :


  • URL . file_id + key, key — - , .
  • nginx :
    • . , .
  • : . , , . : IO , . Java , - Rust/C++ . ( ), IO .


( -), . , , , ( ).


( ): Jenkins/TeamCity, , Java. Java-, , . , " / ". : , ( , ), . IO. , , -, . , nginx' ( ).


, :



, . -, . , API .. , , , . ( ), . , , ( ). (- ).


, - . . , . , « », « ». , : , .



. VK Static Content Hosting . - Sharding ( ). Event Sourcing . , , CQRS , . .


, , ( , ). Sharding , , . CQRS - , RX. 10 web . Event Sourcing Apache Kafka. 10 , . Static Content Hosting: - ( , ), .


, , . , , , , , ( ), (, ).


: , , , . , , 100 ( , ..).


All Articles