Node.js atau Java: kinerja, sumber daya, kontrol aliran, popularitas, dan pengalaman pribadi

Rekan saya dan saya baru-baru ini membahas popularitas beberapa teknologi - khususnya, Java dan node.js. Setelah berselancar di internet, ternyata teknologi inilah yang digunakan banyak raksasa informasi untuk mengembangkan dan memelihara situs mereka di jaringan. Di bawah ini, saya hanya akan memberikan sebagian kecil.

Perusahaan yang menggunakan Java:

gambar

Perusahaan yang menggunakan node.js:

gambar

Hal ini juga kurang menarik bahwa menurut pencarian di memang.com ( 28/6/2019 ) atas permintaan Pengembang Java (30.272 lowongan) dan pengembang node.js (7.401 lowongan), spesialis dalam teknologi ini cukup diminati.

gambar

Tetapi semua ini hanyalah informasi umum mengenai popularitas. Informasi yang mendorong saya untuk menggali lebih dalam ke topik dan berspekulasi tentang masalah fitur teknis, yang menyebabkan penulisan artikel ini.

Mengapa mereka layak dibandingkan?


Java adalah bahasa, node.js dapat disebut ekosistem yang dibangun berdasarkan JS, dan, pertama-tama, berdasarkan V8 - sebuah mesin dari Google.

Namun, ketika kita berbicara tentang Jawa, kita berbicara tidak hanya tentang bahasa, tetapi tentang mesin virtual Java, serta seluruh ekosistem dan infrastruktur yang dibangun di sekitar mesin ini. Minimal, mereka dapat dibandingkan berdasarkan ini - sebagai hasilnya, dalam kedua kasus, kami memiliki runtime . Dalam kasus Jawa, ini adalah mesin virtual. Dalam kasus node.js, itu adalah mesin V8 yang tersedia di sebagian besar sistem operasi, seperti Windows, Linux, MacOS, dan yang kurang terkenal.

Pengembang dapat menulis kode menggunakan bahasa yang sama, dan ini akan bekerja kurang lebih dengan cara yang sama pada sistem operasi yang berbeda karena fakta bahwa ada runtime. Lingkungan runtime memengaruhi bagaimana interaksi dengan OS terjadi. Selain itu, mereka dapat dibandingkan sejak itu mereka digunakan untuk memecahkan berbagai masalah yang serupa .

V8 dan JVM


Ketika kode JS masuk ke v8, hanya dalam waktu kompilasi menjadi kode byte yang digunakan di mesin virtual dilakukan, kode JS berjalan lebih cepat dan lebih cepat.
Kode byte adalah bahasa perantara tingkat tinggi, jadi di mesin virtual Java mereka menulis tidak hanya di Jawa, tetapi juga di Scala dan Kotlin.

Ada beberapa prasyarat bahwa dalam waktu dekat untuk V8 akan dimungkinkan untuk menggunakan tidak hanya JS tetapi juga TypeScript atau yang lainnya. Saat ini, ada transiling bahasa-bahasa ini di JS. Di masa depan, mereka mungkin akan didukung di luar kotak, dan semuanya akan bekerja lebih cepat.

Sekarang ada pengembangan terus menerus dari V8, dan pada umumnya, penampilan versi baru dari node.js dikaitkan dengan munculnya versi baru dari mesin V8. Mereka saling berhubungan secara langsung.

Node.js: kelebihan dan kekurangan


Node.js dibuat oleh Ryan Dahl pada tahun 2009.

Node.js sendiri mencakup beberapa komponen utama:

  • Mesin V8
  • pustaka libuv, yang bertanggung jawab atas bagian tengah dari simpul - suatu perulangan peristiwa, yang berinteraksi dengan OS, serta untuk input / output asinkron (I / O);
  • dari satu set berbagai pustaka JS dan langsung bahasa JS itu sendiri.

Mari kita beralih ke pro dan kontra.

Pro:

  • kemudahan dan kecepatan penulisan
  • ringan
  • kesederhanaan relatif (dibandingkan dengan java)
  • npm (manajer paket simpul (sejumlah besar perpustakaan yang dapat diinstal pada satu baris)
  • setiap perpustakaan jatuh ke pohon ketergantungan dan ini semua dilakukan dengan mudah
  • pengembangan berkelanjutan (TypeScript sedang dikembangkan secara aktif (yang membawa pengetikan, dekorator ke JS dan digunakan, misalnya, untuk Angular)

Cons:

  • fleksibilitas dan perkembangan yang cepat juga menghasilkan kerugian sebagai Anda perlu terus memantau pembaruan, beberapa hal keluar tidak cukup diuji;
  • ada kasus ketika pengembang menghapus perpustakaannya dari NPM dan banyak aplikasi yang menggunakannya berhenti bekerja;

Keuntungan dan kerugian Jawa


Sebaliknya, segera pertimbangkan fitur utama Java.

Pro:

  • kecepatan kerja
  • prevalensi (di universitas di banyak negara mereka belajar java, juga nyaman untuk belajar OOP di java),
  • set besar perpustakaan.

Cons:

  • berat
  • beberapa paradigma Java telah dibuat untuk waktu yang lama dan sudah usang,
  • JDK adalah hak milik, jadi Java berkembang lambat.

Baru-baru ini, JS telah mulai menyalip Jawa (dan semakin jauh, semakin banyak).
Java juga meninggalkan dunia Android, digantikan oleh Kotlin yang, meskipun menggunakan JVM, masih merupakan bahasa yang berbeda.

Oracle dan Google konflik


gambar

Java diciptakan oleh Sun, yang kemudian diakuisisi oleh Oracle dan masih dimiliki olehnya. Karena alasan ini, bagi banyak perusahaan yang menggunakan Java menciptakan beberapa masalah.

Google mengalami masalah ketika Oracle memulai gugatan dengan mereka karena menggunakan Java di Android. Karena itu, Google sangat aktif mengadopsi Kotlin, yang muncul secara independen. Java adalah milik. Tetapi ada mesin virtual Oracle, serta mesin virtual Java terbuka (open JVM), yang digunakan di Linux dan ditulis dalam open source. Terkadang ada beberapa ketidakcocokan, tetapi belakangan ini semakin sedikit.

Omong-omong, Google tidak dapat sepenuhnya meninggalkan Java. Di Dalvik, yang digunakan sebagai inti dalam Android, JVM tertanam. Mungkin mereka akan meninggalkan ini, tetapi akan sangat sulit untuk melakukannya karena hampir seluruh ekosistem Android dibangun di Jawa - terutama berdasarkan penggunaan JVM modern. Dan itu, di beberapa titik, juga merupakan alasan konflik antara Oracle dan Google, karena Oracle melarang hanya memperbarui JVM. Ini adalah bagian terpenting dari Jawa. Dan bahasa itu sendiri dapat digunakan dengan hampir tanpa batasan.

Java vs node.js: kinerja dan konsumsi sumber daya


Pertama-tama, perlu dicatat bahwa kinerja Java jauh lebih tinggi daripada JS, dan karenanya, node.js.

gambar
Kinerja Node.js dan Java

Jika Anda menjalankan beberapa tugas sederhana, seperti mengkuadratkan, maka dalam pengujian indikator dapat bervariasi hingga 10 kali. Jika Anda menjalankan loop dalam jutaan tugas perhitungan, Java hampir selalu akan melampaui node.js. Plus, perbedaan besar antara Java dan node.js adalah bahwa node itu single-threaded, yang merupakan keuntungan dan kerugian di sisi lain.

Java dapat bekerja dengan stream yang didukung di level OS, dan ternyata program yang ditulis dalam Java memanfaatkan kemampuan OS. Dan jika Anda perlu menulis aplikasi yang sangat banyak yang akan menggunakan banyak perhitungan, maka Java pasti akan lebih baik untuk ini. Masalahnya adalah bahwa bahkan sebuah server kecil yang ditulis dalam Java akan memakan banyak memori - baik pada disk maupun online.

Node.js ringan karena arsitekturnya yang digerakkan oleh peristiwa. Itu dibangun untuk bekerja sebagai server web dan melakukan pekerjaan yang sangat baik untuk melayani tugas-tugas ringan. Misalnya, permintaan sederhana seperti menghitung sesuatu, atau menulis ke database, terjadi dengan sangat cepat. Dan jika ada banyak permintaan dan kami ingin skala sistem dalam node, Anda dapat menggunakan server web Nginx atau Apache. Anda dapat memiliki banyak instance simpul yang identik. Kemudian semuanya akan didistribusikan melalui load balancing round-robin. Jika kita menjalankan 8 instance node pada 16 core, masing-masing, OS itu sendiri akan mendistribusikan instance di antara kernel. Node tidak mengontrol ini, ia akan memiliki satu utas.

Kontrol aliran di Java dan node.js


Di Jawa, kita bisa membuat aplikasi dan menjalankan 8 utas di dalamnya. Karena ada interaksi yang lebih dekat dengan OS, Anda dapat mendistribusikan beban.

Seperti yang Anda ketahui, salah satu server web yang ditulis dalam Java adalah kucing jantan. Di sana Anda dapat dengan jelas melihat bahwa ketika pengguna mengajukan permintaan, utas tambahan diluncurkan. Dan ketika permintaan datang ke simpul, loop acara akan diproses dan dikirim kembali, maka permintaan berikutnya akan datang. Dan karena kenyataan bahwa kita tidak mengharapkan hasil yang pertama, itu juga akan diambil. Meskipun permintaannya ringan, semuanya baik-baik saja. Namun, ketika perhitungan yang berat dilakukan, jika ada satu contoh, node berhenti dan terjadi timeout.

gambar
Manajemen utas Java

Pada node, Anda dapat menulis hanya beberapa baris kode dan mendapatkan server web yang paling sederhana. Secara alami, untuk fungsionalitas yang lebih luas, di mana akan ada notifikasi, otorisasi, pencatatan, dll. lebih sulit untuk diimplementasikan, tetapi ada kerangka kerja yang memungkinkan Anda untuk menyelesaikan masalah tersebut.

gambar
Kontrol aliran di node.js

Java memiliki API - concurrency api yang dikembangkan, yang memungkinkan Anda untuk bekerja dengan utas kompetitif. Tetapi pada saat yang sama, ini adalah salah satu masalah sejak itu daya saing adalah hal yang sangat rumit dan tidak semua pengembang berpengalaman dalam hal ini.

Web, REST API adalah elemen dari node, dan terkadang mereka menggunakannya. Tetapi jika kita berurusan dengan perhitungan yang rumit, masih lebih baik menggunakan Java.

Proyek java saya


Di Jawa, saya memiliki proyek yang menarik - aplikasi terdistribusi, tugas utamanya adalah memproses sejumlah besar informasi grafis untuk digunakan lebih lanjut dalam direktori. Saat membuat katalog, Anda perlu menyiapkan set sejumlah besar gambar dari berbagai resolusi yang akan digunakan untuk membuat katalog. Sederhananya, ini adalah aplikasi untuk mengotomatisasi persiapan katalog prepress.

Fotografer dulu harus melakukan semuanya secara manual. Pertama, Anda harus menggunakan beberapa aplikasi kecil untuk mengunggah gambar Anda. Selanjutnya, spesialis membuat direktori harus mengembangkan struktur direktori melalui aplikasi lain. Kemudian, di aplikasi lain, alur kerja telah dibuat yang melemparkan gambar ke dalam struktur yang telah dibuat. Secara umum, prosesnya cukup sulit. Digunakan ImageMagick yang ada di Linux, Windows, MacOS. Kami berurusan dengan Linux.

Misalnya, gambar .tiff dalam ukuran 200-300 mb dimuat ke dalam aplikasi, dan dari sana perlu untuk membuat gambar dari berbagai resolusi, memotong sesuatu, atau membuat substrat.
Versi pertama aplikasi tidak dapat mengatasi beban yang berat, bahkan server dengan 16 prosesor inti tidak ada. Kami telah meningkatkan arsitektur aplikasi untuk menggunakan beberapa contoh sekaligus agar tidak mengubah aplikasi secara mendasar. Banyak contoh diluncurkan yang berinteraksi satu sama lain dan masing-masing dari mereka memproses tugas. Itu sulit, tetapi kami berhasil mengimplementasikan semuanya hanya dalam beberapa bulan. Dan sistem masih bekerja. Dalam prosesnya, kami harus menghadapi persaingan dan berbagai aspek interaksi.

Sesuatu dari proyek ini masih bisa porting ke node, tetapi beberapa hal masih harus dilakukan di Jawa, karena ada banyak perhitungan yang berbeda. Pada dasarnya, kita bisa membuat bagian-bagian pada simpul yang akan memanggil bagian-bagian tertentu di Jawa dan menggunakan arsitektur microservice. Anda dapat menggunakan versi campuran. Tetapi pendekatan ini tidak selalu berhasil, karena pengembang yang berspesialisasi dalam simpul mungkin bukan spesialis di Jawa dan sebaliknya. Dan menemukan pengembang universal jauh lebih sulit.

Dari pengalaman di node.js


Ada proyek untuk mengatur sejumlah besar data. Sesuatu yang mirip dengan proyek yang dijelaskan di atas. Hanya di sini kami mengunggah file yang berisi sekumpulan besar informasi dan dapat divalidasi melalui layanan pihak ketiga (ditulis dalam java), beberapa kali dan sesuai dengan aturan yang berbeda. Itu perlu untuk memproses ratusan gigabyte informasi, dan simpul tidak dimaksudkan untuk ini.

Itu sangat menarik untuk merancang arsitektur sistem, seperti Aplikasi ini terdiri dari beberapa layanan mikro, termasuk yang dari pihak ketiga. Saat bekerja dengan layanan pihak ketiga yang melakukan validasi, kami menggunakan broker pesan RabbitMQ. Kami memberikan informasi yang diperlukan ke server pihak ketiga dan menerima pesan dari RabbitMQ setelah validasi berakhir, kemudian data diproses dalam bagian-bagian untuk menghindari kehabisan memori.

Dan jika awalnya aplikasi memproses file yang berisi 10.000 catatan, sekarang ia dapat memproses hingga satu juta. Kami masih berhasil memecahkan masalah ini menggunakan node.js, meskipun di Jawa itu bisa diselesaikan dengan lebih mudah, namun, pelanggan ingin menggunakan persis node, karena Saya membutuhkan infrastruktur dan arsitektur terpadu dengan layanan microser yang ditulis dalam JS. Menggunakan node untuk menyelesaikan masalah jauh lebih rumit dan membutuhkan lebih banyak waktu, tetapi node.js menang karena skalabilitas. Itulah sebabnya sekarang kita dapat meningkatkan jumlah pekerja dan memproses lebih banyak data. Di Jawa, ini akan lebih rumit.

Sebenarnya, masalah apa pun dapat dipecahkan dengan cara ini dan itu, tetapi perlu diulangi di sini: jika ada banyak perhitungan, lebih baik menggunakan Java, jika tidak banyak perhitungan, Anda dapat menggunakan simpul dengan aman.

Ringkasan dan prospek: akankah node.js dapat menyalip Jawa?


Sekarang sampai pada fakta bahwa node.js akan sering digunakan sebagai pembungkus, dan isian akan ditulis dalam bahasa lain. Kekurangannya sudah lama dikenal. Sebagai contoh, cacat kondisional seperti single-threading telah diperbaiki. Versi terbaru dari simpul memperkenalkan kemampuan untuk menggunakan banyak utas.

Java awalnya diciptakan sebagai solusi ringan menggantikan C ++, dan sekarang telah menjadi kelas berat. Itu seperti evolusi. Mungkin suatu hari nanti akan ada sesuatu yang akan menggantikan simpul.

gambar
Modul - Pengembangan Java vs node.js

Sekarang, sesuai dengan jumlah pesanan, dan menurut perasaan saya, node.js sudah di depan Jawa.
JS aktif berkembang dan akan berubah - mungkin sesuatu akan datang untuk menggantikannya.
Sekarang tidak ada pesaing potensial yang bisa menggantikan Java dan node.js.

Masalahnya adalah bahwa pengembangan Java agak lambat akhir-akhir ini, dan node.js berkembang dengan kecepatan sedemikian rupa sehingga tidak mungkin untuk menggantinya dalam waktu dekat.

Source: https://habr.com/ru/post/id460125/


All Articles