Saya sedang mengerjakan desain aplikasi yang terdiri dari tiga bagian:
- satu utas yang mengawasi peristiwa tertentu yang terjadi (pembuatan file, permintaan eksternal, dll.)
- N utas pekerja yang merespons peristiwa ini dengan memprosesnya (setiap pekerja memproses dan mengonsumsi satu peristiwa tunggal dan pemrosesan dapat memakan waktu variabel)
- pengontrol yang mengelola utas tersebut dan melakukan penanganan kesalahan (memulai ulang utas, mencatat hasil)
Meskipun ini cukup mendasar dan tidak sulit untuk diterapkan, saya bertanya-tanya apa yang akan menjadi cara yang "benar" untuk melakukannya (dalam kasus konkret di Jawa, tetapi jawaban abstraksi yang lebih tinggi juga dihargai). Ada dua strategi yang muncul:
Pengamat / Dapat Diamati: Utas menonton diamati oleh pengontrol. Jika terjadi peristiwa, pengontrol kemudian diberitahu dan dapat menetapkan tugas baru ke utas gratis dari kumpulan utas cache yang dapat digunakan kembali (atau tunggu dan simpan tugas-tugas dalam antrian FIFO jika semua utas sedang sibuk). Pekerja thread menerapkan Callable dan kembali dengan sukses dengan hasil (atau nilai boolean), atau kembali dengan kesalahan, dalam hal ini pengontrol dapat memutuskan apa yang harus (tergantung pada sifat kesalahan yang telah terjadi).
Produser / Konsumen : Utas menonton membagikan BlockingQueue dengan controller (event-queue) dan controller membagikan dua dengan semua pekerja (task-queue dan result-queue). Dalam hal suatu peristiwa, utas menonton menempatkan objek tugas dalam antrian acara. Pengontrol mengambil tugas baru dari antrian acara, meninjaunya dan menempatkannya dalam antrian tugas. Setiap pekerja menunggu tugas baru dan mengambil / mengkonsumsinya dari antrian tugas (pertama datang pertama dilayani, dikelola oleh antrian itu sendiri), menempatkan hasil atau kesalahan kembali ke dalam antrian hasil. Akhirnya, pengontrol dapat mengambil hasil dari antrian hasil dan mengambil langkah-langkah sesuai jika terjadi kesalahan.
Hasil akhir dari kedua pendekatan serupa, tetapi masing-masing memiliki sedikit perbedaan:
Dengan Pengamat, kontrol utas bersifat langsung dan setiap tugas dikaitkan dengan pekerja yang baru melahirkan spesifik. Overhead untuk membuat utas mungkin lebih tinggi, tetapi tidak banyak berkat kumpulan utas yang di-cache. Di sisi lain, pola Observer direduksi menjadi Observer tunggal dan bukan multipel, yang sebenarnya tidak sesuai dengan tujuannya.
Strategi antrian tampaknya lebih mudah diperluas, misalnya menambahkan banyak produsen alih-alih satu secara langsung dan tidak memerlukan perubahan apa pun. Kelemahannya adalah bahwa semua utas akan berjalan tanpa batas, bahkan ketika tidak melakukan pekerjaan sama sekali, dan penanganan kesalahan / hasil tidak terlihat seanggun dalam solusi pertama.
Apa yang akan menjadi pendekatan paling pas dalam situasi ini dan mengapa? Saya merasa sulit untuk menemukan jawaban untuk pertanyaan ini secara online, karena sebagian besar contoh hanya berurusan dengan kasus yang jelas, seperti memperbarui banyak jendela dengan nilai baru dalam kasus Observer atau pemrosesan dengan banyak konsumen dan produsen. Masukan apa pun sangat dihargai.