Memeriksa portal layanan publik regional yang dimuat melalui dalang

Halo, Habr! Anda, juga, dengan penasaran menonton "epik American Wild West tentang pendistribusian bidang tanah - duluan dan tempel bendera untuk dipertaruhkan" atau bahkan mungkin ikut serta di dalamnya. Lebih tepatnya dalam versi modernnya - jadilah yang pertama mengajukan permohonan untuk layanan publik agar dapat menerima uang untuk anak-anak atau mendapatkan izin untuk meninggalkan rumah. Melihat semua ini, saya ingin berbagi pengalaman tim kami dalam pengujian dan berpartisipasi dalam persiapan portal layanan regional untuk penyediaan layanan "Catatan Kelas Pertama". Ini juga sangat mirip dengan efek habra dan, saya pikir, dekat dengan apa yang terjadi beberapa hari yang lalu dengan portal federal gosuslugi.ru, tetapi pada skala regional.

Kami melewati tantangan ini di Khabarovsk pada bulan Januari tahun ini dan baru-baru ini berpartisipasi dalam persiapan layanan serupa untuk mengeluarkan izin berburu di wilayah lain. Di bawah ini adalah sedikit pengalaman yang akan memberi Anda kesempatan untuk melihat masalah mempersiapkan pekerjaan portal layanan publik regional untuk periode puncak dari perspektif lain.

Sebagai permulaan - foto bus hitam, yang bertugas di sekolah selama tiga hari sepanjang waktu, di mana penulis baris ini mengkonfirmasi gilirannya di antara orang tuanya tiga tahun lalu. Setidaknya orang tua kita berkumpul. Menonton di musim dingin di Khabarovsk pada -30 derajat masih menyenangkan.

gambar

Dalam proses mempersiapkan rekaman puncak di kelas satu, beberapa tim bekerja, karena dengan satu atau lain cara, ia terlibat di dalamnya: operator pusat data, operator dan pengembang sistem informasi portal regional, operator dan pengembang sistem informasi pendidikan terintegrasi, dukungan teknis untuk pengguna portal regional. Kami di iondv melakukan tugas terakhir, secara independen memantau kesehatan portal dan mendukung pengguna.

Peran kami dalam persiapan adalah untuk mengatur pengujian dan rekomendasi tentang konfigurasi caching di nginx, yah, kami juga menyiapkan instruksi untuk pengguna dengan "perilaku" yang direkomendasikan.

Bagi yang belum tahu tentang masalah menulis di kelas 1
, . . , , - ( , โ€” ), , - , , . , , , โ€“ , . .

1- , . 0:00 , 10:00 26 . , โ€“ . 10:00 , โ€” , - .

. . 2017 . . , , . .

Layanan untuk sumber daya yang diminta sebagai tugas teknis


Masalah dalam layanan seperti "menulis ke kelas 1" dalam indikator integral beban (atau probabilitas kueri) cenderung ke "fungsi delta" (fungsi,, fungsi Dirac) terlihat jelas pada grafik dalam bentuk puncak. Pada saat ini, ada beberapa peningkatan panggilan dalam waktu singkat.

ฮด-fungsi dan statistik permintaan puncak

Pengalaman kami mengatakan bahwa tugas utama pelatihan bukanlah untuk meningkatkan sumber daya. Tugasnya adalah meminimalkan jumlah permintaan potensial per detik, meregangkannya untuk beberapa periode dan menyiapkan sistem untuk muatan yang tersisa. Dalam hal ini, perlu untuk menemukan dan mempercepat kemacetan - ini akan memberikan efek terbesar sesuai dengan prinsip-prinsip teori sistem terikat (prinsip Goldratt). Dan jika tidak, itu adalah kemacetan yang akan gagal. Seluruh sistem harus bekerja darinya: prinsip "drum-buffer-rope."

Secara fisik tidak mungkin untuk menumpahkan seluruh volume dalam 10 menit dari jam pasir dalam 1 menit - jelas bahwa mereka akan runtuh. Begitu pula untuk penyediaan layanan. Itu tidak mengejutkan siapa pun - ketika giliran MFC dan skandal untuk menerima layanan, tetapi mengejutkan semua orang - mengapa portal turun.

Ada berbagai pola perilaku penanganan beban dari teori antrian :

  • Anda dapat menahan pengguna, mis. menambah antrian;
  • Anda bisa menolak untuk melayani mereka yang datang kemudian, misalnya, sampai yang sebelumnya diproses;
  • Anda dapat mencoba meningkatkan produktivitas tanpa henti.

Kegunaan ada di antara keduanya. Memang, untuk layanan dengan sumber daya terbatas yang disediakan oleh suatu wilayah atau negara, tidak hanya kecepatan yang penting, tetapi, pertama-tama, pelestarian keadilan sosial - yaitu kondisi yang sama untuk semua. Pada saat yang sama - jika pengguna belum menerima apa yang dia butuhkan, dia memulai permintaan baru. Dalam kasus ini, permintaan tumbuh dalam longsoran salju, membentuk model serangan " efek tumpukan anjing " (efek tumpukan anjing, penyerbuan cache, hit miss storm) - pengguna telah membatalkan permintaan dan memulai permintaan baru, sementara yang sebelumnya masih dalam antrian untuk diproses.

Proses ini memperkuat fakta bahwa seluruh keluarga berpartisipasi dalam pengajuan - ayah dan ibu mengisi aplikasi pada saat yang sama, dan seringkali mengirimkan aplikasi beberapa kali untuk keandalan. Dan selain itu, sering juga di beberapa tab dan beberapa browser. Oleh karena itu, beban puncak yang diharapkan biasanya masuk akal untuk dikalikan 2-3 kali, dari jumlah mereka yang benar-benar mendaftar untuk layanan tersebut.

Retret keadilan
, ยซยป, . ? ยซยป , . . โ€” , . ยซ ยป. . .

Organisasi penyediaan layanan


Kami menghitung jumlah pelamar yang diharapkan berdasarkan kombinasi data pada jumlah total aplikasi yang diajukan tahun lalu dan data per menit untuk wilayah lain. Biasanya, puncak aplikasi jatuh pada 5-10 menit, termasuk karena portal hampir tidak merespons selama tiga hingga lima menit pertama, dan kemudian pengguna mengisi formulir dari 1 hingga 5 menit (jangan heran, banyak yang mengisi dari telepon bahkan dalam kondisi "gugup") .

Model perhitungan perkiraan untuk aplikasi bersyarat 1000 per jam adalah sebagai berikut:

  • puncak dari 5 hingga 10 menit dari awal dan 80% aplikasi akan diajukan di bawah aturan Paretto
  • Secara konvensional, kami merencanakan 160 aplikasi per menit atau 3 aplikasi per detik.

Bahkan, pengiriman pertama terjadi setelah satu menit dan 45 detik, dan puncak aplikasi berubah dari 4 menit.

Untuk mengurangi beban pada ESIA dan sistem dari menghasilkan sesi otorisasi, instruksi menyarankan agar pengguna masuk terlebih dahulu dan memperpanjang masa sesi. Bahkan, 50% disahkan dalam 1 jam, dan ~ 90% dalam setengah jam. Kami temui sebelumnya bahwa pengguna mulai masuk ke portal 10 menit sebelum dimulainya layanan - dan otorisasi mulai bekerja dengan tidak stabil. Sulit untuk mengatakan alasannya. Mungkin alasannya adalah bahwa ketika pekerjaan teknis dilakukan di Moskow pada malam hari, di Khabarovsk kita baru saja memulai hari kerja.

Mundur tentang instruksi dan pengaturan organisasi
.

, ยซ ยป . .. . , - ..

, , , . - . , , .

Tidak mungkin untuk menghapus "fungsi delta" ketika formulir dimuat kembali pada pukul 00:00. Inti dari prosedur ini adalah bahwa layanan muncul pada waktu tertentu. Tetapi Anda dapat mencoba untuk mengurangi jumlah permintaan browser pada semua rute pengguna yang diharapkan dan dengan demikian meninggalkan beban pada sistem hanya dari yang diperlukan - formulir, direktori dinamis dan pengiriman aplikasi.

Pengaturan nginx sendiri cukup standar. Di sini lebih penting untuk memilih batasan yang dapat ditahan oleh sistem. Ambil mereka - yaitu mulai permintaan antrian ketika server diharapkan mencapai batas kemampuannya.

Yah, dan yang paling penting, kami memaksakan caching (proxy_cache) dan meningkatkan masa pakai data "kadaluwarsa" dalam nginx untuk semua jalur statis dan, jika mungkin, halaman dinamis di mana tidak ada sesi. By the way, ini adalah kesalahan umum ketika caching - menulis ke data cache (kadang-kadang bahkan statika) di mana sesi orang lain disimpan, hasilnya biasanya untuk menghapus cookie ini dari header jika server tidak dapat memisahkan tipe data.

Di browser untuk pengguna, sepertinya memperbarui halaman dari file yang diunduh dari disk atau memori. Tetapi bahkan ketika pengguna mendapatkannya dari server, mereka diambil dari cache nginx. Direktori itu sendiri, tentu saja, di-cache dalam sistem itu sendiri.

gambar

Ini mengurangi jumlah permintaan potensial dari 89 permintaan menjadi 14 dan volume dari 2,1 MB (untuk 1000 pengguna yang memperbarui halaman, ini merupakan potensi puncak dari 4-8 Gbit / dtk) menjadi 38 Kb (kita semua ingat webpack, tetapi untuk platform entrprise ini bukan selalu mudah dilakukan). Menurut hasil dari bagian ini, masih perlu untuk cache tidak hanya dalam sistem, tetapi juga di nginx beberapa direktori dari bentuk dan pengklasifikasi dinamis yang tidak digunakan pada saat puncak dan memaksa masa pakai untuk mereka. Dan dengan peningkatan beban, biasanya masuk akal untuk meletakkan halaman statis penuh utama dengan mengarahkan pengguna ke layanan yang diinginkan atau membuat sumber daya terpisah untuk layanan.

Untuk mengurangi beban pengiriman, draft dan pengisian data otomatis untuk anak dinonaktifkan. Semua pengguna memiliki kecepatan entri data yang berbeda, yang menghilangkan tampilan formulir yang benar-benar siap untuk pengiriman dan menghindari fungsi delta untuk mengirim aplikasi - semua 1000 dalam satu menit. Pada saat yang sama, keadilan sosial dipertahankan, meskipun, tentu saja, keluhan muncul.

Saya tidak akan menjelaskan optimasi sistem itu sendiri - selama pengujian beban, kemacetan diidentifikasi - terutama dalam permintaan DBMS dan indeks dan permintaan itu sendiri dioptimalkan.

Mungkin optimasi yang paling penting adalah menyederhanakan formulir. Apa yang paling mempengaruhi kecepatan ketika diimplementasikan dalam formulir?

  • โ€” , , . โ€” 5-10 ( iPhone ) 5- 375 / (1 10 , application/x-www-form-urlencoded โ€“ 20 ), 100 625 /. 100/ โ€” . , ยซ ยป. โ€” ? , . , ?
  • panduan canggih. Beban biasanya meningkat dengan menggunakan direktori alamat FIAS atau CLADR. Masalahnya di sini adalah karena ukuran - FIAS membutuhkan hingga 40GB dalam database dan butuh waktu untuk mencarinya. Sepersepuluh detik, tetapi dikalikan dengan 1000 permintaan secara bersamaan, memuat sistem apa pun. Tanpa persiapan khusus, mungkin dalam bentuk layanan web yang terpisah dan pada sumber daya yang terpisah, sulit untuk menahan beban - oleh karena itu, mereka sering menggunakan bidang teks biasa untuk alamat.

Baiklah, mari kita beralih ke tes.

Muat pengujian dalam persiapan


Pengujian dilakukan melalui dalang - dengan meniru tindakan pengguna di peramban Crominium. Yanedeks.tank dan JMeter mengalahkan perlindungan terhadap serangan, karena mereka menghasilkan banyak jenis permintaan yang sama. Selain itu, tes ini lemah bertepatan dengan profil pertanyaan nyata ketika mengubah perilaku sistem yang sedang dimuat. Selain itu, server meminta cache, dan sulit untuk mereproduksi bagian dari proses di dalamnya (misalnya, otorisasi). Ngomong-ngomong, dari salah satu seminar devDV kami memiliki presentasi dengan presentasi tentang penggunaan dalang untuk pengujian, termasuk memuat, tautan ke video .

Untuk memulainya, kami menyusun profil perilaku pengguna dan membagi prosedur menjadi beberapa tahapan utama:

  1. otorisasi massal di ESIA
  2. memperbarui satu kali formulir layanan,
  3. pakan massal

Untuk setiap tahap kami melakukan tes terpisah.

Tahun lalu, ada kesulitan pada tahap otorisasi di ESIA, tetapi mengujinya dalam skala penuh sulit. Sistem ini eksternal, perlindungan terhadap serangan dan larangan otorisasi dipicu. Namun demikian, dimungkinkan untuk merumuskan profil pengujian untuk memverifikasi dengan tepat kemacetan sistem yang diuji - biasanya ini adalah jumlah sesi yang diotorisasi secara simultan dan nilai otorisasi yang direncanakan per menit, yang dapat disesuaikan dengan rekomendasi.
Dalam pengujian, pembungkus penting untuk mengatur beberapa utas, kami menggunakan 'puppeteer-cluster'. Tetapi biasanya lebih rumit untuk menangani pengecualian dan mengubah perilaku portal di bawah elemen tata letak yang sering terungkap yang muncul dua kali. Atau elemen tidak muncul jika beberapa data tidak memuat seperti yang diharapkan. Ini semua adalah kesalahan yang akan dilihat pengguna dan memuat ulang halaman - yang berarti mereka akan membuat beban tambahan. Ada dua cara: menerapkan penanganan pengecualian dalam tes. Atau modifikasi portal.

Tes itu sendiri sederhana. Di bawah ini adalah bagian dari mengklik tombol "Login" pada portal layanan untuk memasukkan data ke ESIA.

await page.waitForSelector(AUTH_AVAIL,{timeout:OPT_ELEM_WAIT_TIME});
const needAuth = await page.$(ELEM_AUTH_IN);
if (!needAuth) throw (new Error(`  `));
        
await page.waitForSelector(AUTH_BUT, OPT_ELEMENT_VISIBLE);
await page.click(AUTH_BUT);
await waitNewUrl(page, 'https://esia.gosuslugi.ru/idp/rlogin?cc=bp', OPT_PAGE_WAIT_TIME);
await page.waitForSelector('#mobileOrEmail', OPT_ELEMENT_VISIBLE);
let text = await elemGetText(page, '#authnFrm > div.login-slils-box > div > div.detected > div.left > div.this-user');
if (text) 
   text = text.replace(/ -\(\)/g, '');        
if (text && text.indexOf(user) === -1) {
  await page.click('div.click-to-another > a');
  await page.waitForSelector('#authnFrm > div.login-slils-box > div >' +
                ' div.detected > div.left > div.this-user', OPT_ELEMENT_INVISIBLE);
}
await page.waitForSelector('#password', OPT_ELEMENT_VISIBLE);
await page.type('#mobileOrEmail', user);
await page.type('#password', pwd);
await page.click('#loginByPwdButton');

Verifikasi memperbarui formulir aplikasi sambil menunggu pengguna "membuka catatan." Tes reboot pada dasarnya adalah satu langkah, tetapi penting untuk memeriksa jenis kesalahan yang dikembalikan - jaringan adalah masalah, kesalahan nginx, kesalahan server, dan apakah formulir memenuhi kriteria. Dan kesulitannya adalah untuk menghasilkan volume maksimum permintaan dalam jumlah waktu paling sedikit dan tidak termasuk dalam batasan perlindungan (namun, selama pengujian dapat diubah, di sisi lain, itu juga merupakan pemeriksaan dari pengaturan jaringan dan infrastruktur server dan WAF).

Tes semacam itu pada dalang membutuhkan banyak sumber daya untuk bekerja. Secara de facto ternyata Anda membutuhkan setidaknya 2 core terhadap inti 1 dari subsistem front-end dan saluran yang sangat luas. Tetapi ketika menyewa mereka di cloud - ini cukup terjangkau. Kami menggunakan Yandex.cloud.

Dalam pengujian, otorisasi pertama kali diterapkan dalam ESIA untuk setiap aliran secara terpisah. Setelah itu, browser terpisah diluncurkan untuk setiap utas dan dalam kerangka satu contoh sejumlah pembaruan dilakukan. Setelah itu, instance restart. Pemeriksaan itu sendiri dapat mencakup jalur tipikal, misalnya, halaman utama, bentuk layanan. Tetapi lebih sering itu hanya cukup untuk sepenuhnya memperbarui layanan dan memeriksa direktori yang diperlukan agar layanan dapat dikirimkan - semua seperti dalam instruksi untuk pengguna.

gambar

Sebuah fragmen tes untuk membuka main dan menyegarkan halaman.

try {
  await page.setViewport(PUP_OPT);
  await page.goto(BASE_URL);
  await page.setCookie(...cookies[worker.id]);
  await page.goto(`${BASE_URL}/nd/lk/form/dnv.htm`);
  rdyRefresh++;
} catch (err) {
  console.error(`#       ${data}: ${err.message}`);
  getErr++;
  await page.screenshot({path: filename});
}
for (let i = 0; i < AMOUNT_REFRESH - 1; i++) {
  const filenameIter = path.join(BASE_DIR, PIC_DIR, `${data}-${i}.png`);
   try {
       await page.reload({waitUntil: ["networkidle0", "domcontentloaded"]});
        rdyRefresh++;
    } catch (err) {
        if (!err.message.includes('Navigation failed because browser')) {
           console.error(`#     ${data}-${i}: ${err.message}`);
           getErr++;
           await page.screenshot({path: filenameIter});
        }
   }
}

Untuk memuat dengan mengirimkan aplikasi, seluruh siklus verifikasi dilaksanakan - dengan memuat ulang formulir dan verifikasi input semua data.

Pecahan.

for (let i = 0; i < AMOUNT_RESEND; i++) {
   const filename = path.join(BASE_DIR, PIC_DIR, `${data}-${i}.png`);
  try {
     await page.goto('https://uslugi27.ru/nd/lk/form/dnv.htm');
  } catch (err) {
      console.error(`#      1  ${data}-${i}: ${err.message}`);
      await page.screenshot({path: filename});
      getErr++;
      continue;
 }
 try {
     const FORM_PREF = '#createForm > div:nth-child(4) > ';
     await clickDelayed(page,`${FORM_PREF}fieldset.petgroup.ungroupped-attrs > div > div:nth-child(4) > div.col-md-9.attr-data`);
// <โ€ฆ>
     await page.type(`${FORM_PREF}fieldset:nth-child(2) > div > div:nth-child(1) > div.col-md-9.attr-data > input`, '');
// <โ€ฆ>
  } catch (err) {
      console.error(`#      ${data}-${i}: ${err.message}`);
      await page.screenshot({path: filename});
     continue;
  }
  try {
      await page.click('#createForm > div.col_100.controls > button.btn.btn-primary.pull-right.next');
      await clickDelayed(page,`#createForm > div:nth-child(5) > fieldset > div > div:nth-child(1) > div > div`);
       await page.click('#createForm > div:nth-child(5) > fieldset > div > div:nth-child(2) > div > div');
       await page.click('#createForm > div.col_100.controls > button.btn.btn-success.pull-right.submit');
  } catch (err) {
    console.error(`#     ${data}-${i}: ${err.message}`);
    await page.screenshot({path: filename});
    sendErr++;
    continue;
  }

Ngomong-ngomong, tes bisa dipercepat jika Anda memasukkan semua data bukan dari dalang oleh halaman tunggu.tipe konstruksi, tetapi transfer logika ini ke browser itu sendiri. Tetapi kemudian kompleksitas kesalahan penangkapan meningkat. Seperti itu

document.querySelector('#createForm > div:nth-child(4) > fieldset.petgroup.ungroupped-attrs > div > div:nth-child(4) > div.col-md-9.attr-data').click();
 document.querySelector('#createForm > div:nth-child(4) > fieldset:nth-child(2) > div > div:nth-child(1) > div.col-md-9.attr-data > input').value = '';

Selama pengujian, kami menyediakan beberapa ribu otorisasi ESIA dan sekitar 16 ribu aplikasi yang dikirim. Bagaimana pemulihan sistem informasi pendidikan yang produktif setelah sejumlah pernyataan - bahkan tidak bertanya. Ini adalah kisah yang sangat berbeda.

Hasil utama yang terlihat dari proses ini adalah bahwa media lokal sudah bosan pada hari-hari pendaftaran di kelas satu. Layanan telah meninggalkan area media.

Secara paralel, kami membuat dasbor untuk memantau fungsionalitas formulir berdasarkan Grafana: jumlah aplikasi, jumlah panggilan, metrik Yandex, dll. Tetapi kita akan meninggalkan topik ini untuk waktu berikutnya.

Baiklah, saya ingin mengucapkan selamat kepada semua orang yang terhubung dengan topik peningkatan kualitas penyediaan layanan negara bagian dan kota dalam bentuk elektronik. Pekerjaan persiapan tanpa akhir ini tidak sia-sia - setelah semua, pada bulan April dan Mei jumlah aplikasi yang diajukan meningkat secara signifikan.

All Articles