Bagaimana multi-threading berbeda dalam Aplikasi Web berbasis Java vs Aplikasi Java yang Berdiri Sendiri


13

Saya cukup baru di Jawa dan pengalaman saya terbatas pada Aplikasi Berbasis Web yang berjalan di Web Container (Jboss dalam kasus saya).

Apakah saya benar mengatakan bahwa untuk Aplikasi Web, wadah web menangani multi-threading? Jika demikian, dapatkah saya memperkenalkan tapak baru di aplikasi Berbasis Web? Apakah ada keuntungan dalam melakukannya dan dalam skenario apa seseorang perlu melakukan itu?


Hingga EE6 Jangan Gunakan Thread; EE7 memperkenalkan Concurrency Utilities.
Reinstate Monica - M. Schröder

Jawaban:


20

Apakah saya benar mengatakan bahwa untuk Aplikasi Web, wadah web menangani multi-threading?

Sebagian besar webservers (Java dan lainnya, termasuk JBoss) mengikuti model "satu utas per permintaan", yaitu setiap permintaan HTTP diproses sepenuhnya dengan tepat satu utas. Utas ini akan sering menghabiskan sebagian besar waktu menunggu hal-hal seperti permintaan DB. Wadah web akan membuat utas baru jika diperlukan.

Beberapa server (dalam ekosistem Java terutama Netty ) melakukan penanganan permintaan tidak sinkron, baik dengan model "satu utas melakukan segalanya", atau sesuatu yang lebih kompleks. Gagasan dasarnya adalah bahwa memiliki banyak utas menunggu menghabiskan sumber daya, sehingga bekerja secara serempak dapat lebih efisien.

Jika demikian, dapatkah saya memperkenalkan tapak baru di aplikasi Berbasis Web?

Itu mungkin, tetapi harus dilakukan dengan sangat hati-hati, karena kesalahan (seperti kebocoran memori atau sinkronisasi yang hilang) dapat menyebabkan bug yang sangat sulit untuk diperbanyak, atau menjatuhkan seluruh server.

Apakah ada keuntungan dalam melakukannya dan dalam skenario apa seseorang perlu melakukan itu?

Nah, keuntungannya adalah Anda bisa melakukan hal-hal secara paralel. Menggunakan utas untuk meningkatkan kecepatan komputasi murni adalah sesuatu yang tidak boleh Anda lakukan pada server web, karena itu akan memperlambat penanganan permintaan lainnya. Hal semacam itu harus dilakukan pada server yang terpisah, mungkin menggunakan semacam antrian pekerjaan.

Skenario yang sah untuk multithreading dalam konteks menangani permintaan HTTP mungkin jika Anda perlu mengakses sumber daya jaringan lain, misalnya memanggil beberapa layanan web yang berbeda. Jika Anda melakukannya dalam satu thrad, Anda harus menunggu setiap panggilan selesai pada gilirannya. Tetapi jika Anda menggunakan banyak utas, total waktu tunggu hanyalah penundaan untuk satu panggilan paling lambat.


3
Masuk akal. Apakah ExecutorService Interface cara terbaik untuk terus membuat utas baru dalam aplikasi web?
kapricanon

4
@apapanon: ya, kecuali jika Anda memiliki beberapa persyaratan khusus yang tidak dapat ditangani, atau server web Anda sudah memiliki sesuatu yang serupa.
Michael Borgwardt

2

Menanggapi pertanyaan Anda:

Bagaimana multi-threading berbeda dalam Aplikasi Web berbasis Java vs Aplikasi Java yang Berdiri Sendiri

Itu tidak berbeda. Biasanya aplikasi web perangkat lunak yang dibangun akan menyediakan beberapa multi-threading dengan membuat setiap permintaan baru sebagai utas. Dengan Anda dapat menggunakan / membuat utas sama seperti yang Anda lakukan pada aplikasi lain.

Memang multi-threading dapat memberi Anda peningkatan kinerja drastis jika Anda menggunakannya dengan benar. Untuk tugas intensif I / O seperti akses jaringan dan akses disk drive, peningkatan kinerja hampir selalu dijamin. Untuk tugas-tugas intensif komputasi Anda harus tetap berpegang pada aturan satu utas per inti di server. Misalnya jika inti Anda memiliki prosesor i7, Anda harus tetap menggunakan 7 utas untuk melakukan tugas komputasi.

Menanggapi pertanyaan Anda:

Apakah ada keuntungan dalam melakukannya dan dalam skenario apa seseorang perlu melakukan itu?

Michael Borgwart mengatakan Anda tidak harus melakukan ini untuk meningkatkan kecepatan komputasi. Saya tidak setuju, karena artikel ini menyarankan multi-threading dapat membantu memberikan respon ketika pengguna membutuhkan tugas yang berat secara komputasional. Dalam bahasa Inggris yang sederhana, pengguna tidak perlu menunggu selama menyelesaikan tugas berat komputasi dengan multi-threading.

Jika Anda sering ingin menggunakan utas, saya sarankan penggunaan utas kolam. Ini akan mengurangi overhead pembuatan utas.


bagaimana ini menjawab pertanyaan yang diajukan?
nyamuk

1
Jawaban harus didasarkan pada kemampuan mereka sendiri. Jika Anda ingin berkomentar, Anda harus mendapatkan 50 poin reputasi terlebih dahulu.
ChrisF

1

Yah ini adalah pertanyaan yang bagus dan saya pikir sebagian besar pengembang yang bekerja dalam pengembangan aplikasi web tidak menggunakan multithreading secara eksplisit. Alasannya cukup jelas karena Anda menggunakan server aplikasi untuk menyebarkan aplikasi Anda, server aplikasi secara internal mengelola kumpulan utas untuk permintaan yang masuk.

Lalu mengapa menggunakan multithreading secara eksplisit? Apa yang dibutuhkan pengembang aplikasi web agar dapat melakukan multithreading?

Ketika Anda bekerja pada aplikasi skala besar di mana Anda harus mem-server banyak permintaan secara bersamaan, sulit untuk melayani setiap jenis permintaan secara serempak karena jenis permintaan tertentu bisa saja melakukan banyak pemrosesan yang dapat menurunkan kinerja aplikasi Anda.

Mari kita ambil contoh di mana aplikasi web setelah melayani jenis permintaan tertentu harus memberi tahu pengguna melalui email dan SMS. Melakukannya secara sinkron dengan utas permintaan dapat menurunkan kinerja aplikasi web Anda. Jadi inilah peran mutlithreading. Dalam kasus seperti itu, disarankan untuk mengembangkan aplikasi multithreaded yang berdiri sendiri melalui jaringan yang bertanggung jawab untuk mengirim email dan SMS saja.


mengapa jawaban ini diturunkan?
Anurag Sharma
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.