Node.js sudah berhasil beroperasi pada skala global, sebagaimana dibuktikan oleh aplikasi yang dikerahkan di perusahaan-perusahaan seperti Netflix, Reddit, Walmart dan Ebay. Namun, ia memiliki serangkaian masalah saat penskalaan; dari sudut pandang penskalaan orang yang bekerja pada basis kode tunggal, jadi dari sudut pandang penskalaan vertikal dan horizontal di awan. Selain pengalaman pribadi saya dengan penskalaan Node.js untuk perusahaan seperti Reddit dan Netflix, saya berbicara dengan beberapa pakar di Microsoft Azure dan memberikan beberapa tips untuk Anda tentang penskalaan Node.js untuk perusahaan Anda.
Tulis Node.js yang berkualitas
Semakin cepat Anda mulai menggunakan linter, memformat, dan mengetikkan alat pemeriksaan dalam kode Anda, semakin baik.
Hal-hal ini mungkin sulit untuk diperkenalkan di tengah-tengah proyek karena potensi besar jumlah refactoring yang mungkin diperlukan, itu juga dapat mencemari riwayat git Anda, tetapi pada akhirnya alat ini akan membantu Anda membuat kode dapat dibaca.
Jika Anda masih belum menggunakannya, segera
alihkan mata Anda ke
ESLint dan
Prettier . ESLint akan melindungi kode Anda dari pola yang buruk, Prettier akan membantu Anda memformat kode Anda secara otomatis sebelum menarik permintaan.
Solusi yang lebih substansial adalah menambahkan alat seperti Flow atau TypeScript ke basis kode Anda. Alat-alat ini memungkinkan Anda untuk menangkap kesalahan yang lebih halus, seperti memanggil fungsi dengan parameter numerik alih-alih string atau memanggil metode
.filter pada objek, bukan array. Terlepas dari kerumitan dan kebutuhan untuk melatih tim Anda, alat-alat ini pantas mendapatkan perhatian Anda: mereka dapat mempercepat pengembangan dengan Intellisense dan mencegah kesalahan runtime dengan perlindungan tipe.
Tulis tes
Tes selalu menjadi masalah sulit bagi pengembang. Beberapa sangat percaya pada pengembangan yang digerakkan oleh tes, sementara yang lain jarang menulis tes sama sekali. Tapi ada jalan tengah:
- Tetapkan modul-modul utama dan tulis tes unit komprehensif untuknya. Berikan perhatian khusus pada "perjalanan bahagia": kasus tepi dan skenario di mana kesalahan dapat berpotensi terjadi. Untuk modul lain, tulis satu atau dua unit test yang mencakup "jalur bahagia" dan mungkin kasus umum yang mungkin Anda temukan
- Tes UI minimum . UI terus berubah dan sering kali tidak praktis untuk menghabiskan banyak waktu melakukan tes untuk kode yang akan sering berubah.
- Tulis tes untuk mendeteksi bug . Setiap kali Anda menemukan dan memperbaiki bug dalam kode Anda, tulis unit test yang akan menangkap bug ini di masa depan.
- Tulis beberapa tes integrasi untuk memastikan bahwa semua bagian cocok satu sama lain.
- Tulis tes end-to-end yang lebih sedikit . Tutupi jalur utama di situs Anda, misalnya, jika Anda membuat situs e-commerce, mungkin ada baiknya menulis tes untuk memasuki situs, menambahkannya ke keranjang dan memeriksa daftar produk. Tes-tes ini mahal untuk dipertahankan, jadi pertimbangkan untuk mempertahankan inti kecil dari tes yang dapat Anda motivasi untuk mempertahankannya.
Titik awal untuk menulis tes adalah kemampuan untuk menyebarkan kode baru dengan percaya diri. Tulis begitu banyak tes yang tidak kurang dari apa yang Anda rasakan sendiri, tetapi cobalah untuk menulis tidak lebih dari daftar di atas.
Desain Stateless
Kuncinya saat menulis Node.js yang dapat diskalakan adalah bahwa server Anda tidak harus menyimpan status untuk seseorang atau sesuatu. Ini akan mencegah penskalaan horizontal. Pindahkan status ke aplikasi lain dan selesaikan masalah di tempat lain (mis. Redis, Etcd, ...). Anda harus memikirkan ini terlebih dahulu. Maka akan sangat sulit untuk diurai jika Anda belum melakukan ini sebelumnya. Ini juga akan membantu jika Anda pernah memutuskan untuk menguraikan monolith menjadi layanan microser.
Statistik: untuk pengembangan - Node.js, untuk produksi - CDN
Bagaimana saya ingin perusahaan melihat kesalahan dalam kesalahan ini. Melayani aset statis Anda dari aplikasi web Anda (khususnya, melalui sesuatu seperti webpack-dev-server atau server dev Parsel) adalah pengalaman pengembang yang hebat karena memperpendek siklus pengenalan saat menulis kode. Namun, Anda sebaiknya tidak pernah melayani statika melalui Node.js. Itu harus dikirim secara terpisah melalui CDN, seperti Azure CDN.
Pengembalian statis dengan Node.js tidak perlu lambat karena CDN lebih tersebar dan oleh karena itu secara fisik lebih dekat dengan pengguna akhir, dan server CDN sangat dioptimalkan untuk sumber daya kecil. Mempertahankan statika dengan Node juga tidak masuk akal mahal, karena waktu server Node.js jauh lebih mahal daripada waktu server CDN.
Mulai penggelaran awal, sebarkan lebih sering
Saya tidak mengenal Anda, tetapi ketika saya men-deblock sesuatu untuk pertama kalinya, itu tidak pernah berhasil. Ini biasanya karena saya lupa mengirim kunci privat yang benar atau mengkodekan path ke host lokal. Masalah kecil yang bekerja secara lokal menolak untuk melakukan ini. Masalah-masalah ini dapat menumpuk, dan apa yang dapat dengan mudah diperbaiki sebelum, jika, tentu saja, mereka terlalu dini untuk menemukannya, dapat berubah menjadi sejumlah besar kesalahan yang tidak dapat dipahami yang tidak dapat ditangkap secara normal.
Omong-omong,
Visual Studio Code memungkinkan Anda untuk memecahkan masalah semacam ini . Ini memungkinkan Anda untuk menyebarkan aplikasi Anda langsung ke Azure dengan satu klik. Ini adalah cara yang cukup sederhana untuk memverifikasi bahwa tidak ada masalah penyebaran ke lingkungan lain.
Menyebarkan 2 server sekaligus
Nasihat ini datang dari pengetahuan saya yang sulit didapat dan lautan sakit hati. Inti dari saran ini adalah bahwa ada beberapa perbedaan antara penyebaran dua server dan sepuluh server, dan tidak ada banyak perbedaan antara penyebaran sepuluh server dan seratus server. Namun, hanya ada perbedaan besar antara menggunakan satu server dan dua server.
Mirip dengan masalah penggelaran server stateless, dimulai dengan dua server, Anda dapat dengan cepat mengatasi masalah penskalaan horizontal Anda sehingga ketika ada lonjakan tajam dalam lalu lintas, Anda siap untuk mengukur.
Jangan takut dengan garis
Database modern mengatasi sejumlah membaca dan menulis sendiri, tanpa bantuan Anda. Saat Anda menguji ide Anda, silakan mengandalkan database Anda untuk menangani beban kerja berukuran kecil hingga menengah.
Penskalaan prematur lebih mungkin membunuh Anda daripada menyelamatkan Anda. Tetapi, pada titik tertentu, aplikasi Anda akan tumbuh sehingga Anda tidak akan dapat menulis semuanya ke database juga, dihadapkan dengan masalah bandwidth baca dan tulis. Untuk beberapa aplikasi yang memiliki catatan ringan, atau jika Anda memilih database seperti Cassandra, yang menangani skala besar sendiri, ini akan menjadi masalah nanti, bagi yang lain itu akan lebih awal.
Jika Anda memiliki atau akan segera memiliki masalah seperti itu, Anda akan memiliki opsi untuk memilih teknologi yang akan Anda gunakan lebih lanjut. Salah satu teknologi ini mungkin adalah antrian pesan. Standar aktual saat ini adalah Apache Kafka, yang memungkinkan Anda untuk mengatur pesan Anda dalam topik, dan kemudian aplikasi untuk berlangganan topik ini. Jadi, misalnya, Anda dapat mengakumulasikan pesan dalam aplikasi, mendengarkan topik tertentu, dan kemudian menulis data ke dalam basis data Anda sehingga tidak tersumbat setiap saat.
Selain itu, Kafka berjalan dengan mudah di Azure .
Layanan microser untuk penskalaan
Ketika aplikasi Anda tumbuh, pembagian logis alami mulai muncul. Satu bagian dari aplikasi dapat memproses pembayaran, sementara bagian lainnya akan melayani API untuk frontend Anda. Saat membuat pembagian yang logis, pertimbangkan untuk memisahkannya dengan layanan microser. Tapi hati-hati, karena pengenalan layanan mikro juga penuh dengan kompleksitas. Tapi itu sepadan. Jadi, misalnya, setiap layanan mikro dapat memiliki metrik sendiri. Dengan mengevaluasi mereka, Anda dapat mengatur skala mereka secara mandiri.
Gunakan wadah
Aplikasi Anda mungkin berfungsi dengan baik secara lokal, tetapi mungkin ada masalah serius yang mencoba untuk digunakan. Alat-alat seperti Docker dan Kubernetes akan bekerja untuk Anda untuk menghindari masalah ini. Docker, yang dapat Anda bayangkan sebagai mini-instance (wadah) Linux atau Windows, di mana Anda dapat menjalankan aplikasi; dan Kubernet sebagai alat yang menghubungkan semua kontainer Anda bersama di cloud.
Kubernetes mungkin binatang yang kompleks, tetapi binatang yang memecahkan masalah yang kompleks. Jika Anda seorang penyihir DevOps yang tidak berpengalaman, maka Anda mungkin mengalami kesulitan, jadi saya sarankan memulai dengan
Draft . Jika Anda terbiasa dengan
Yeoman untuk proyek Javascript, maka Anda dapat mengevaluasi Draft sebagai alat yang serupa, tetapi untuk proyek Kubernetes: alat yang membuat kerangka gambar untuk proyek Anda. Dari sana, Anda dapat menggunakan alat
Helm untuk menginstal potongan arsitektur tambahan yang perlu Anda bangun (mis. Nginx, lebih banyak Node.js, MongoDB, server Kafka, dll.), Hampir seperti
npm untuk Kubernetes.
Segera setelah Anda memahami ekosistem Kubernetes, mulai sekarang, menggunakan awan akan menjadi permainan anak-anak.
Kumpulkan metrik
Jika Anda tidak tahu bagaimana menjawab pertanyaan "Bagaimana cara kerja aplikasi saya?", Maka Anda akan memiliki masalah atau mereka akan segera. Lagi pula, berbagai macam indikator dari waktu ke waktu akan membantu Anda terus meningkatkan keadaan aplikasi Anda. Dari sudut pandang biaya untuk masa depan, dan dari sudut pandang kenyamanan pengguna dalam hal meningkatkan waktu respons. Anda pasti harus melacak metrik seperti jalur lambat, tampilan halaman, waktu sesi, dan metrik kunci lainnya yang penting bagi bisnis Anda.
Ada banyak cara untuk mengumpulkan indikator-indikator ini. Layanan seperti New Relic dan AppDynamics akan memberi Anda informasi yang sangat berharga tentang cara meningkatkan aplikasi Anda.
Jika Anda bekerja dengan Azure, Wawasan Aplikasi juga mengatasi kebutuhan ini, dan juga mudah untuk menyambungkan alat lain seperti CI / CD.
CI / CD akan menyelamatkan Anda dari begitu banyak rasa sakit
Berapa kali Anda merusak penyebaran selama FTP dan mematikan server Anda selama beberapa menit? Itu bersamaku. Anda tidak boleh mempercayai diri sendiri dalam menyebarkan kode produksi. Cara melakukan ini menggunakan Visual Studio Code cukup keren, tetapi terutama untuk tujuan pengembangan atau demonstrasi. Ketika Anda siap untuk membuat sistem tingkat produksi, Anda harus menggunakan integrasi berkelanjutan dan penyebaran berkelanjutan (sering disingkat CI / CD - integrasi berkelanjutan dan penyebaran berkelanjutan).
Integrasi berkelanjutan adalah praktik pengembangan perangkat lunak, yang terdiri dari menggabungkan copy pekerjaan ke dalam cabang utama umum pengembangan beberapa kali sehari dan melakukan rakitan proyek otomatis yang sering dilakukan untuk dengan cepat mengidentifikasi potensi kerusakan dan menyelesaikan masalah integrasi.
Penerapan berkelanjutan terus mengambil kode Anda yang lulus CI, menjalankan langkah-langkah yang diperlukan untuk membangun, kemas atau mengepaknya, dan mengirimkannya ke server. Ini adalah praktik yang baik untuk memiliki beberapa level untuk diuji. Anda mungkin lebih dulu pergi ke server dev internal untuk melihatnya di lingkungan berisiko rendah terlebih dahulu. Anda dapat mengujinya terlebih dahulu sebelum mengirimnya ke lingkungan QA di mana teknisi QA Anda atau mungkin layanan eksternal akan mengonfirmasi bahwa semuanya berfungsi seperti yang diharapkan. Dari sana, Anda dapat pergi ke lingkungan perantara di mana aplikasi Anda masih hanya internal, tetapi bekerja menggunakan data dan pengaturan produksi, sehingga Anda dapat mengujinya di lingkungan produksi itu sendiri sebelum mengirimkannya langsung ke produksi. Anda juga dapat memilih sekelompok kecil server untuk memeriksa kode baru: Anda dan mengarahkan hanya sebagian kecil lalu lintas nyata ke server ini untuk memastikan tidak ada yang rusak saat bekerja dengan pengguna nyata. Jika rusak, Anda tahu ke mana harus mencari masalah. Jika tidak, Anda dapat beralih dari sekelompok kecil pengguna ke semua orang.
Banyak vendor dan proyek open source menangani kebutuhan ini. Jenkins, Travis dan CircleCI adalah pilihan bagus untuk CI. Azure memiliki layanan CI / CD sendiri yang disebut Azure Pipelines, dan cukup intuitif untuk digunakan, dan sekali lagi, ia dengan mudah terhubung ke ekosistem Azure yang terintegrasi.
Jaga rahasia
Setiap aplikasi pasti memiliki beberapa rahasia. Itu bisa berupa kunci dan jalur rahasia dari kredensial, database, dan banyak lagi. Akan sangat buruk jika mereka beralih ke tangan yang salah. Namun, mereka perlu menjalankan aplikasi. Jadi apa yang kita lakukan? Biasanya dalam pengembangan kita akan menggunakan alat-alat seperti
dotenv untuk menyimpan file konfigurasi secara lokal dan dapat membacanya melalui process.env di Node.js. Ini bagus untuk pengembang, tetapi buruk untuk produksi.
Sebagai gantinya, berguna untuk menggunakan beberapa jenis alat manajemen rahasia. Untungnya,
Kubernetes memiliki sistem bawaan dan cukup mudah digunakan. Anda memberikan rahasia Kubernetes di sisi wadah, dan kemudian akan memberikannya ke aplikasi Anda sebagai lingkungan yang sangat mempersulit serangan.
Alat lain yang patut Anda perhatikan adalah Azure
Key Vault . Apa yang keren tentang Vault Kunci, meskipun Microsoft tidak dapat membaca kunci Anda (hanya Anda yang dapat mendekripsi), Azure akan melacak log Anda dan melacak setiap penggunaan yang meragukan dari kunci Anda untuk mengingatkan Anda akan adanya kompromi.
Kesimpulan
Node.js, seperti platform lainnya, perlu ditingkatkan. Dan, seperti platform lainnya, ia memiliki tugasnya sendiri dan kekhususan penskalaan, yang patut diketahui dan yang harus diperhitungkan ketika merancang proyek-proyek besar.
Artikel asli: "Sebelas Tips untuk Menimbang Node.js" (
En ).
Saya sarankan di komentar untuk berbagi kiat yang dapat Anda berikan pada penskalaan Node.js. Akan menarik untuk didengar.