Hi, beberapa hari yang lalu gw dapat kesempatan untuk sedikit mempresentasikan bagaimana cara kerja thread di java. Sebenarnya gw cuma dapat apes aja karena ga ada yang presentasi akhirnya gw yang ditunjuk. Tetapi di sisi lain gw menyadari bahwa selama ini, banyak anggota tim gw yang bikin scheduler tapi sebenarnya ga ngerti cara pakainya, cuma taunya kalau bikin scheduler itu berarti sebuah proses akan dilempar ke thread lain tanpa mengganggu thread utama. Ga salah juga, cuma kalau pemahaman cuma seperti itu, ya ga benar juga. Jadi kali ini gw akan membahas mengenai scheduler di Spring Webflux.
Jika mengacu dokumentasi reactor core, sebenarnya ada banyak sekali tipe schedulers. Hanya saja, ada beberapa yang paling sering digunakan. Ada 5 tipe schedulers yang sering digunakan. Berikut tipe-tipenya :
- Scheduler immediate : Biasanya digunakan ketika sebuah API mewajibkan menggunakan scheduler, tapi kita masih ingin menggunakan main thread.
- Scheduler single : Biasanya digunakan untuk thread yang sifatnya unik dan memiliki return yang cacheable sampai thread yang digunakan akan dimatikan.
- Scheduler parallel : Biasanya digunakan untuk memaksimalkan kapasitas cpu yang ada namun task yang dijalankan bersifat pendek. Jumlah thread yang mampu dibuat berdasarkan jumlah CPU.
- Scheduler elastic : Scheduler yang paling sering digunakan karena sifatnya dynamic dan dapat digunakan untuk task yang memakan waktu panjang. Selain itu, elastic akan terus membuat thread apabila thread yang lain sedang sibuk mengerjakan proses yang lain.
- Scheduler from Executor : Scheduler ini juga sering digunakan karena menggunakan executor dimana jumlah thread, lama hidupnya thread dan maximun queue thread yang bisa dihandle dapat dikonfigurasi dengan metode hitung yang tepat.
Dari kelima scheduler diatas, yang paling sering digunakan oleh tim gw adalah elastic dan executor. Seperti yang gw bilang diatas, sebenarnya karena tidak paham penggunaannya, makanya hanya 2 ini saja yang dipakai, padahal kalau tahu cara menggunakannya, maka pemakaian yang tepat akan meningkatkan performance sistem juga. Sebagai bonus gw akan sedikit share bagaimana visualisasi thread dengan menggunakan tools bernama visual VM.
Bagi kalian yang suka melakukan optimasi thread dan performance di java harusnya sudah sangat paham untuk cara menggunakannya. Berikut perbandingan thread berdasarkan scheduler yang digunakan :
Untuk yang immediate mungkin tidak terlihat nama threadnya, karena pada dasarnya menggunakan main thread yakni XNIO-task (ini merupakan worker thread untuk undertow, beda lagi dengan jetty dan tomcat, mungkin akan gw bahas terpisah nantinya). Untuk scheduler single, bisa dilihat hanya terdapat 1 thread bernama single-1. Scheduler parallel bisa dilihat ada 12 karena CPU laptop gw setara dengan 12 core.
Nah, bagaimana dengan elastic? Kok disitu hanya terlihat 1? Karena kebetulan dengan 1 thread bisa menghandle request yang ada, kalau saja gw menggunakan jmeter dan melakukan request secara gila-gilaan maka akan membuat banyak sekali thread. Ingat, jumlah thread yang bisa dibuat itu terbatas, semakin banyak thread yang dibuat maka akan semakin memungkinkan untuk terjadinya OOM atau memory leaks. Oleh karena itu, pemakaian elastic harus digunakan sebijak mungkin untuk menghindarinya terjadi memory leaks.
Lalu yang terakhir adalah from executor dimana menggunakan executor service sebagai configurationnya (bisa dilihat dengan nama thread with-threadPoolTask-n). Tetapi balik lagi, menggunakan configurable jika kita tidak bisa menghitungnya dengan baik akan membuat masalah baru bernama thread mampet (agak aneh ya, cuma nanti gw akan jelaskan secara practical di post yang berbeda).
Bagi kalian yang ingin mencoba sendiri bisa pull github gw disini.
Demikian sedikit post gw mengenai scheduler, jika mungkin ada yang salah atau ingin didiskusikan bisa tulis di kolom komentar hehe.
Untuk sumber bisa dilihat disini