Pola arsitektur yang nyaman

Halo, Habr!


Mengingat peristiwa terkini, karena coronavirus, sejumlah layanan Internet mulai menerima peningkatan beban. Sebagai contoh, salah satu rantai ritel di Inggris menghentikan situs dengan pesanan online , karena tidak ada kapasitas yang cukup. Dan jauh dari selalu memungkinkan untuk mempercepat server hanya dengan menambahkan peralatan yang lebih kuat, namun, permintaan klien harus diproses (atau mereka akan pergi ke pesaing).


Dalam artikel ini, saya akan secara singkat berbicara tentang praktik populer yang akan memungkinkan Anda untuk membuat layanan yang cepat dan toleran terhadap kesalahan. Namun, dari skema pengembangan yang mungkin, saya memilih hanya yang sekarang mudah digunakan . Untuk setiap item, Anda memiliki perpustakaan yang sudah jadi, atau Anda dapat memecahkan masalah menggunakan platform cloud.


Penskalaan horisontal


Item paling sederhana dan paling terkenal. Secara konvensional, yang paling umum adalah dua skema penyeimbangan beban - penskalaan horizontal dan vertikal. Dalam kasus pertama, Anda mengizinkan layanan untuk bekerja secara paralel, sehingga mendistribusikan beban di antara mereka. Yang kedua, Anda memesan server yang lebih kuat atau mengoptimalkan kode.


Sebagai contoh saya akan mengambil penyimpanan file cloud abstrak, yaitu, beberapa analog dari OwnCloud, OneDrive dan sebagainya.


Gambaran standar skema semacam itu di bawah ini, namun, hanya menunjukkan kompleksitas sistem. Bagaimanapun, kita perlu menyinkronkan layanan. Apa yang terjadi jika pengguna menyimpan file dari tablet dan kemudian ingin menontonnya dari telepon?



: , — , .


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