Ən sevdiyim müsahibə suallarından biri də “ Asink və gözləyən sözlər sizə nə deyir?”. çünki bu, müsahiblə maraqlı müzakirə aparmaq imkanı yaradır... Yaxud da bu mövzuda danışdıqları üçün yox. Fikrimcə, bu texnikadan niyə istifadə etdiyimizi başa düşmək çox vacibdir.
Mənə elə gəlir ki, bir çox tərtibatçılar “ən yaxşı təcrübədir” ifadəsinə etibar etməyi və asinxron metodlardan kor-koranə istifadə etməyi üstün tuturlar.
Bu məqalə praktikada asinxron və sinxron metodlar arasındakı fərqi göstərir.
Aşağıdakı şəkildə bir benchmark işlədəcəm. İki müstəqil çəyirtkə nümunəsi iki maşında işləyir. Çəyirtkə nümunələri aşağıdakıları edən istifadəçini simulyasiya edir:
Başlıq altında hər bir Tətbiq Xidməti öz verilənlər bazasına qoşulur və beş saniyə çəkən və bir neçə sıra məlumatı qaytaran SELECT sorğusunu yerinə yetirir. İstinadlar üçün aşağıdakı nəzarətçi koduna baxın. Mən verilənlər bazasına zəng etmək üçün Dapper-dən istifadə edəcəyəm. Diqqətinizi ona yönəltmək istərdim ki, asinxron son nöqtə verilənlər bazasını asinxron olaraq da çağırır ( QueryAsync<T> ).
Əlavə etmək lazımdır ki, mən eyni kodu hər iki proqram xidmətinə yerləşdirirəm.
Test zamanı istifadəçilərin sayı hədəf sayına bərabər artır ( İstifadəçilərin sayı ). Artım sürəti Spawn Rate parametri ilə idarə olunur (saniyədə qoşulacaq unikal istifadəçilərin sayı) — rəqəm nə qədər çox olarsa, istifadəçilər bir o qədər tez əlavə olunur. Kürü sürəti bütün eksperimentlər üçün 10 istifadəçi/s olaraq təyin edilib.
Bütün təcrübələr 15 dəqiqə ilə məhdudlaşır.
Maşın konfiqurasiya təfərrüatlarını məqalənin Texniki Təfərrüatlar bölməsində tapa bilərsiniz.
Qırmızı xətlər uyğun olaraq asinxron, mavi xətlər isə sinxron son nöqtəyə aiddir.
Bu nəzəriyyə haqqında. başlayaq.
Görə bilərik ki, hər iki son nöqtə eyni şəkildə işləyir - 5200 ms median cavab müddəti ilə dəqiqədə təxminən 750 sorğunu idarə edir.
Bu təcrübədə ən maraqlı qrafik iplik trendidir. Sinxron son nöqtə (mavi qrafik) üçün əhəmiyyətli dərəcədə yüksək rəqəmlər görə bilərsiniz - 100-dən çox mövzu!
Baxmayaraq ki, bu gözləniləndir və nəzəriyyəyə uyğundur — sorğu daxil olduqda və proqram verilənlər bazasına zəng etdikdə mövzu bloklanır, çünki o, gediş-gəlişin tamamlanmasını gözləməli olur. Buna görə də, başqa bir sorğu daxil olduqda, proqram onu idarə etmək üçün yeni bir mövzu yaratmalıdır.
Qırmızı qrafik - asinxron son nöqtə mövzu sayı - fərqli davranışı sübut edir. Sorğu daxil olduqda və proqram verilənlər bazasına zəng etdikdə, mövzu bloklanmaq əvəzinə mövzu hovuzuna qayıdır. Buna görə də, başqa bir sorğu daxil olduqda, bu pulsuz mövzu yenidən istifadə olunur. Daxil olan sorğuların artmasına baxmayaraq, proqram heç bir yeni mövzu tələb etmir, ona görə də onların sayı eyni qalır.
3-cü metrik - median cavab müddətini qeyd etməyə dəyər. Hər iki son nöqtə eyni nəticəni göstərdi - 5200 ms. Deməli, performans baxımından heç bir fərq yoxdur.
İndi payları qaldırmağın vaxtıdır.
Yükü iki qat artırdıq. Asinxron son nöqtə bu tapşırığı uğurla yerinə yetirir – onun dəqiqəlik tələbi 1500 ətrafında dəyişir. Sinxron qardaş nəhayət, müqayisə olunan 1410 sayına çatdı. Lakin aşağıdakı qrafikə baxsanız, bunun 10 dəqiqə çəkdiyini görəcəksiniz!
Səbəb odur ki, sinxron son nöqtə yeni istifadəçinin gəlişinə başqa mövzu yaradaraq reaksiya verir, lakin istifadəçilər sistemə əlavə edilir (yalnız sizə xatırlatmaq üçün ki, Kürü Rate 10 istifadəçi/s) veb serverin uyğunlaşa bildiyindən daha tezdir. Ona görə də ilk vaxtlarda çoxlu müraciətləri növbəyə qoydu.
Təəccüblü deyil ki, iplərin sayı metrikası asinxron son nöqtə üçün hələ də 34-ə yaxındır, sinxron olan üçün isə 102-dən 155-ə yüksəlmişdir. Median cavab müddəti bir dəqiqəlik sorğu ilə eyni şəkildə azaldı - sinxron cavab müddəti eksperimentin əvvəlində daha yüksək idi. Testi 24 saat saxlasaydım, median rəqəmlər bərabər olardı.
Üçüncü eksperiment ikincisi zamanı aşkar edilmiş tendensiyaları sübut etmək üçün nəzərdə tutulub - biz sinxron son nöqtənin daha da deqradasiyasını görə bilərik.
Sinxron əməliyyatlar yerinə asinxrondan istifadə performansı və ya istifadəçi təcrübəsini birbaşa yaxşılaşdırmır. Birincisi, təzyiq altında sabitliyi və proqnozlaşdırıla bilənliyi artırır. Başqa sözlə, o, yük həddini qaldırır ki, sistem pisləşmədən əvvəl daha çox emal edə bilsin.
Ən təmiz test nəticəsini əldə etmək üçün hədəf Tətbiq Xidmətlərinin yerləşdiyi eyni şəbəkədə yerləşən 2 VM-dən testlər keçirməliydim.
Bununla belə, mən güman edirdim ki, şəbəkə gecikməsi hər iki tətbiqə daha çox və ya daha az oxşar şəkildə təsir edəcək. Buna görə də, o, əsas məqsədə - asinxron və sinxron metodların necə davrandığını müqayisə etməyə təhlükə yarada bilməz.
Sinxron son nöqtəni demək olar ki, asinxron işləməyə məcbur etmək və aşağıdakı qrafiki tərtib etmək üçün nəyi sındırdım (təcrübə şərtləri üçüncü ilə eynidir — 200 istifadəçi)?