Saya bekerja sebagai pimpinan teknis dalam tim Sistem, yang bertanggung jawab atas kinerja dan stabilitas layanan. Dari Maret hingga November 2020, Miro tumbuh tujuh kali lipat - hingga 600+ ribu pengguna unik per hari. Sekarang monolit kami berjalan di 350 server, kami menggunakan sekitar 150 instans untuk menyimpan data pengguna.
Semakin banyak pengguna berinteraksi dengan layanan, semakin banyak perhatian yang dibutuhkan untuk menemukan dan menghilangkan kemacetan pada server. Izinkan saya memberi tahu Anda bagaimana kami memecahkan masalah ini.
Bagian satu: pernyataan masalah dan pengantar
Dalam pemahaman saya, aplikasi apa pun dapat direpresentasikan sebagai model: itu terdiri dari tugas dan penangan. Tugas diantrekan dan dijalankan secara berurutan, seperti pada gambar di bawah ini:
Tidak semua orang setuju dengan pernyataan masalah ini: seseorang akan mengatakan bahwa tidak ada antrian di server RESTful - hanya penangan, metode pemrosesan permintaan.
Saya melihatnya secara berbeda: tidak semua permintaan diproses secara bersamaan, beberapa menunggu giliran di memori mesin web, di soket, atau di tempat lain. Ada antrian sih.
Miro WebSocket , . , , . , .
, β .
, . , , .
: . , β , β . : . : , . , β .
: . , . , . , .
, , , . , , .
. : (1%) , (99%).
: . , (userβs action).
: 2% , , β , . UX β , . .
:
. .
, , , : - input/output (IO).
, . β . , , SQL- .
(data access layer, DAL) , . , (observable).
: Miro jOOQ SQL. : SQL-, . Redis , . DAL . , , . .
RESTful , - .
, .
. , , SQL Redis. time-counters: , , Redis .
Prometheus Jaeger. ? , β . .
: Miro, . , , β . Prometheus , .
β , . Jaeger . β .
Stack trace
, , , . β .
data access layers stack trace. , end point Redis.
stack trace , . β , , .
Miro stack traces Grafana, dump third-party . : projects.pt.server.RepositoryImpl.findUser (RepositoryImpl.java:171) RepositoryImpl.findUser:171.
WatchDog
stack trace β , . , , .
β WatchDog. , . , .
β 100 5 . WatchDog thread, stack trace.
: 5 , stack trace. , alert, β , - deadlock .
2020 , , Miro 20% . , .
, β , . . β , . .