Concurrency vs Event Loop

Serupa Tapi Tak Sama

D. Husni Fahri Rizal
The Legend
4 min readDec 19, 2020

--

Pada artikel sebelumnya kita telah membahas mengenai perbedaan antara concurrency dan paralel proses. Sekarang kita mencoba membahas perbedaan dua konsep lain yang sekilas terlihat sama tetapi pada cara implementasinya jauh berbeda dan dari outputnya juga sangat berbeda. Kita akan mencoba membahas perbedaan antara Event Loop dan Concerrency.

Mengulas kembali, concurrency adalah teknik pemrograman yang digunakan untuk menyelesaikan permasalahan dengan banyak request atau banyak prosess yang diselesaikan dalam waktu yang sama. Ciri utama dari proses concurrent adalah proses satu dengan proses yang lain tidak akan bisa dilakukan secara bersamaan pada suatu resource tertentu. Biasanya proses satu bergantian dengan proses lainnya. Dikarenakan sangat cepat jadi terkadang terlihat seperti dilakukan bersamaan.

Hal yang paling menyulitkan dari proses concurrency adalah bagaimana kita memprediksi hasil atau output dari proses. Hal ini karena terjadinya pembagian resource yang digunakan bersamaan. Kondisi ini kita sering menyebutnya sebagai race condition.

Dengan demikian, perlu kita pahami dengan jelas bahwa tidak setiap concurrency berarti performance bahkan pada situasi tertentu bisa menjadi celah bug dan sangat menurunkan performance karena terjadi block proses.

Event Loop adalah proses yang hanya memiliki SATU THREAD dengan banyak loop atau proses pengulangan yang tidak terhingga atau terus menerus. Pada cara ini kita hanya mengerjakan satu task dan untuk menghandle banyak reguest kita melakukan seleksi dan prioritas terhadap task yang dikerjakan. Dengan kata lain kita melakukan Thread Safe sehingga dijamin pasti proses ini akan aman terhadap tumpang tindih satu proses dengan proses lainnya.

Untuk beberapa kasus event loop ini memberikan performance yang lebih bagus dibandingkan concurrency karena tidak ada blok yang terjadi.

Di ambil dari https://www.baeldung.com/spring-webflux-concurrency

Apabila dijelaskan maka secara umum event loop memiliki flow atau alur proses sebagai berikut.

  1. Event emiter atau sumber dari event akan memasukan task ke event queue. Task-task ini akan antri untuk dieksekusi pada proses loop selanjutnya.
  2. Event loop akan mengambil task dari event queue dan memprosesnya berdasarkan handler yang ada. Pada prose ini, dilakukan prioritas pengerjaan dengan algoritma tertentu. Proses yang terjadi adalah sequential satu persatu dan loop akan kembali segera setelah meregistrasikan callback pada handler dari proses.
  3. Apabila proses telah selesai, event loop akan men-triger callback dan memberikan informasi proses selesai dan mengirimkan hasil kepada yang memanggil proses ini.

Pada awalnya event loop ini banyak diadopsi oleh teknologi pada javascript. Hampir semua framework yang berhubungan dengan frontend menggunakannya dengan tujuan optimasi terhadap resource yang digunakan. Sebutlah Node.js atau Nginx yang sudah terkenal menggunakan event loop pada proses ascronousnya.

Akan tetapi sekarang teknologi backend juga sudah mulai banyak menggunakan event loop ini dengan tujuan yang sama salah satunya optimasi resource yang digunakan. Sebutlah framework yang ada pada java seperti Netty, RxJava, Reactor, Spring, Spark, Micronout, atau ActiveJ adalah beberapa contoh framework yang sudah mengimplementasikan konsep event loop ini.

Event Loop Plus Concurrency

Membuat aplikasi hanya mengandalkan proses concurrency akan sangat menantang dan rawan bug terjadi. Aplikasi kita minimum akan berjalan dengan blocking proses setiap aplikasi mulai berjalan. Dengan demikian apabila kita mau mengambil performance yang maksimal kita harus mencoba menghubungkan antara event loop dan concurrency.

Kita dapat menyebut proses ini dengan kata lain Thread Pool dengan Thread yang aman. Contoh yang bagus implementasi gabungan konsep ini adalah terjadi pada Nginx web proses.

Pada proses utama setiap request pada nginx akan di handle sama event loop worker yang merupakan single thread yang aman. Apabila Nginx memerlukan pemrosesan yang bersamaan seperti memabca file atau memproses header dan body makan proses ini akan di lemparkan ke Thread Pool yang memproses secara bersamaan. Apabila proses ini telah selesai maka proses akan di kembalikan ke loop sebagai pemrosesan yang aman.

Saya sendiri telah berhasil membuat sistem dengan konsep event loop ini dengan menggunakan spring web flux dan berhasil juga menggabungkan dengan teknologi berbasis Thread Pool atau concerrency seperti Spring Batch untuk pemrosesan data secara paralel. Spring Web Flux dan Spring Batch perpaduan teknologi untuk memproses data secara aman, cepat , dan ramah lingkungan (ramah resource hardware).

Kesimpulan

Banyak software yang dibuat hanya menggunakan event loop saja atau concurrency saja. Akan tetapi menggunakan keduanya adalah cara terbaik dalam membuat aplikasi dengan kinerja aplikasi yang handal, aman, dan dapat menggunakan sumber daya hardware secara optimal dan efisien.

References

  1. https://en.wikipedia.org/wiki/Event_loop
  2. https://projectreactor.io/
  3. https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html
  4. https://www.nginx.com/blog/tag/event-loop/
  5. https://spring.io/projects/spring-batch
  6. https://medium.com/@tigranbs/concurrency-vs-event-loop-vs-event-loop-concurrency-eb542ad4067b

Sponsor

Membutuhkan kaos dengan tema pemrograman :

Kafka T-shirt

Elastic T-shirt

Dapat menghubungi The Legend.

--

--

D. Husni Fahri Rizal
The Legend

Engineering Leader | Start-Up Advisor | Agile Coach | Microservices Expert | Professional Trainer | Investor Pemula