Dari waktu ke waktu, pengembang yang mendukung aplikasi simpul lama memiliki keraguan tentang perlunya mentransfer aplikasi dari versi lama ke simpul baru. Argumen utama yang mendukung tetap pada yang lama adalah "Saya tidak menggunakan fitur baru, tetapi implementasi mereka tentu akan memperlambat pemrosesan secara keseluruhan." Plus, situasinya bisa sangat rumit dengan adanya dependensi pada perpustakaan yang tidak lagi didukung di bawah node baru, dan perubahan dalam versi node secara otomatis diterjemahkan ke dalam pemrosesan signifikan dari arsitektur aplikasi. Artikel saya, saya harap, akan membantu mereka memutuskan masalah ini.
Sebelum Anda mulai, saya ingatkan Anda prinsip dasar bisnis TI:
BEKERJA, JANGAN SENTUH!Jika aplikasi Anda berfungsi sebagaimana mestinya, jika sepenuhnya mengatasi tugas dan tidak ada kebutuhan mendesak untuk pemrosesan, lebih baik meninggalkan semuanya apa adanya. Daur ulang bisa menjadi proses yang sangat menyakitkan dan panjang. Dan sebagai hasilnya, Anda tidak akan mendapatkan manfaat nyata, selain rasa kepuasan estetika, dan saat ini bisnis Anda akan menderita.
Artikel saya adalah untuk mereka yang masih memiliki kebutuhan. Saya akan menggambarkan situasi saya saat ini, berbicara tentang kesulitan yang dihadapi dalam menyelesaikannya, dan memberikan hasil yang akhirnya saya terima.
Saya mengembangkan sistem untuk mengumpulkan dan memproses log aplikasi lain. Beban kerja yang mapan - ratusan ribu log per menit per komponen. Sistem diskalakan dengan baik secara horizontal, memiliki arsitektur modular, berhasil bekerja selama lebih dari satu tahun dan mengatasi fungsinya secara keseluruhan. Versi node yang digunakan adalah 0.10
Apa yang kamu hadapiSecara alami, tidak kekurangan fungsionalitas. Fitur es6 baru bahkan tidak dianggap sebagai argumen. Tentu saja, mereka membuat hidup sedikit lebih baik, tetapi tidak lebih. Untuk salah satu tugas kami, fungsi dari simpul lama sudah cukup. Masalah muncul di tempat yang paling tidak terduga karena fungsinya menjadi lebih kompleks.
Masalah Satu:
Salah satu komponen dengan beban puncak yang masuk dan konsumsi memori di bawah 5GB tiba-tiba mulai melambat. Masalahnya tidak terjadi setiap waktu, secara spontan, biasanya di dekat ujung puncak. Jika aplikasi tidak jatuh dalam batas waktu, kinerja secara bertahap pulih dalam waktu setengah jam atau satu jam. Reboot segera sembuh.
Setelah proses "debug dalam", ternyata seluruh proses mulai melambat, bahkan operasi sinkron, itulah sebabnya disimpulkan bahwa pemulung itu sendiri "semakin parah". Apa yang harus dilakukan tentang itu sama sekali tidak jelas. Satu-satunya solusi adalah mencari riwayat perubahan dalam kode kami selama beberapa bulan dan mengembalikan fungsionalitas penting. Di sisi lain, masalah tidak sering terjadi, tidak setiap hari, dan restart sistem secara manual juga tampaknya menjadi solusi yang sepenuhnya dapat diterima (manual berarti skrip berdasarkan sinyal detektor jaminan simpanan). Kami lebih condong ke opsi kedua. Dan jika bukan karena masalah kedua, maka kemungkinan besar itu akan diterapkan.
Masalah kedua:
Komponen kami yang lain memakan banyak memori. Karena komponen ini sebenarnya adalah cache, "keserakahan" -nya pada prinsipnya dapat dijelaskan. Sampai saat ketika itu diperlukan untuk membatasi dari atas ke volume yang ditentukan secara ketat. Dan kemudian komponen itu mendapatkan ingatan dan tidak terburu-buru untuk memberikannya. Dan bahkan bekerja dengan kecepatan hampir idle. Artinya, pada saat beban puncak, manajer memori simpul memilih memori maksimum, dan bahkan dengan margin, dan kemudian menahannya hingga akhir abad ini (me-reboot komponen, misalnya). Saya akan segera menyebutkan bahwa secara alami opsi kebocoran telah diperiksa dan diverifikasi. Sayangnya, tidak ada kebocoran, dan sekali lagi kami menemui jalan buntu.
Saya mencoba bertanya di berbagai tempat di Internet bagaimana melakukan manajemen memori suatu simpul dan bagaimana menyelesaikan situasi kami. Tetapi sebagai tanggapan, saya hanya menerima banyak hal negatif tentang penggunaan 0,10 node. Secara umum, negativitas inilah yang menggerakkan saya ke tugas beralih ke versi terbaru dari node.
Apa yang menahan?1. Takut akan kehilangan produktivitas.
Mereka yang bekerja dengan python ingat bahwa transisi dari garis 2.x ke 3.x disertai dengan hilangnya produktivitas yang substansial. Saya tidak tahu bagaimana keadaan di python sekarang, mungkin situasinya telah membaik. Tetapi cukup logis untuk berharap bahwa setelah menambahkan semua fitur baru ini ke es6, node juga dapat tenggelam dengan kuat. Saya mencoba google benchmark untuk membandingkan node baru dengan yang lama, saya tidak menemukan sesuatu yang masuk akal.
2. Kinerja JSON.parse
Karena kami bekerja dengan log, JSON.parse menempati bagian terbesar dari prosesor. Pada suatu waktu, kami membandingkannya pada versi yang berbeda dari node dan mendapat penurunan kinerja sekitar 30%. 4.x simpul dibandingkan dengan 0,10 dan 0,12.
Faktanya, alasan-alasan ini tidak menentukan, karena prosesor bukanlah hambatan. Selain itu, untuk tugas tersebut ada penskalaan horizontal.
3. Ketergantungan Paket
Tapi ini adalah batu sandungan. Komponen paling kompleks pusat kami menggunakan paket libmysqlclient, yang hanya bekerja di bawah simpul 0,10. Lebih buruk lagi, panggilan sinkronnya. Artinya, tidak mungkin untuk hanya mengubah driver mysql, mengganti satu panggilan dengan yang lain, tanpa secara mendalam memproses arsitektur komponen dari sebagian sinkron ke pemrosesan sepenuhnya tidak sinkron. Selain itu, bagian yang paling sulit dalam tugas ini bukanlah prosesnya sendiri seperti bagaimana membenarkan manajemen akan kebutuhannya dan menunjukkan apa yang sebenarnya akan diberikan proyek :)
Apa yang memberi?Akibatnya, kami masih bergerak dari node 0,10 ke lts 8,11.x terakhir
1. Tidak ada penurunan kinerja. Sebaliknya, kami menerima peningkatan urutan 10-15%
2. Konsumsi memori meningkat secara signifikan, sekitar 30-50%, tergantung pada komponen
3. Masalah "tidak terpecahkan" yang disuarakan di atas diselesaikan sendiri
4. Kami akhirnya mendapat kesempatan untuk menggunakan fitur baru dari es6! Meskipun kehabisan kebiasaan, kami masih belum menggunakannya)))