Jika Anda memiliki tugas yang ingin Anda jalankan hanya sekali pada sekelompok server, secara berkala apa yang akan menjadi cara terbaik untuk mencapai ini? Definisi cluster dalam hal ini adalah 2 atau lebih server identik dengan sesi terdistribusi duduk di belakang load balancer.
Use Case: Anda memiliki tugas yang mahal untuk dijalankan yang seharusnya hanya dijalankan sekali per X jam. Pekerjaan ini misalnya dapat mengulangi banyak catatan dan memperbarui status mereka.
- Skenario terburuk adalah bahwa menjalankan pekerjaan dua kali membuat data Anda tidak valid.
- Skenario terbaik adalah pekerjaan menggunakan sumber daya di semua server Anda.
Ringkasan Persyaratan:
- Pekerjaan itu masih harus berjalan bahkan jika salah satu node sedang down.
- Pekerjaan hanya harus dijalankan sekali per jadwal.
- Jika beberapa pekerjaan dijadwalkan pada waktu yang sama atau pada waktu yang tumpang tindih, maka jumlah pekerjaan yang berjalan didistribusikan secara merata di antara server.
- Mesin harus memiliki basis kode yang sama dan disinkronkan melalui NTP.
- Konfigurasi mungkin berbeda antara simpul dan simpul, berdasarkan variabel lingkungan.
- Pekerjaan harus dimulai tepat waktu atau dalam interval waktu yang ditentukan yang diberikan. (misalnya 5 menit)
Solusi yang memungkinkan
- Tetapkan satu simpul sebagai simpul utama, ini tidak berfungsi karena melanggar 1 di atas.
- Buat permintaan agar penyeimbang muatan menyeimbangkan untuk memulai pekerjaan. Sayangnya ini memiliki efek samping bahwa jika Anda memiliki beberapa pekerjaan berjalan pada saat yang sama mereka semua dapat dijalankan oleh mesin yang sama.
Ini harus dijalankan di Jawa, dalam wadah servlet. Namun itu bukan coding pekerjaan yang saya cari.
Tentunya ini adalah masalah terpecahkan dengan solusi terbaik yang diketahui.
Pertanyaan terkait. /programming/5949038/schedule-job-executes-twice-on-cluster
Ini bukan duplikat karena solusinya tidak mencukupi sesuai dengan 5 persyaratan yang diberikan di atas. Solusi yang paling banyak dipilih mengalami masalah balapan, dan solusi kedua melanggar persyaratan 3
Beberapa server aplikasi memiliki fitur untuk "layanan singleton lebar klaster".
Misalnya Weblogic memiliki fitur Layanan Singleton yang dikonfigurasi melalui konsol admin web.
Anda harus menulis kelas yang mengimplementasikan weblogic.cluster.singleton.SingletonService dan menggunakannya untuk mendeklarasikan layanan di konsol admin. Cluster menangani instantiating kelas dan memberi tahu Anda ketika layanan dimulai atau dihentikan. Antarmuka SingletonService memiliki metode aktifkan () dan nonaktifkan ().
Panggilan Weblogic mengaktifkan () ketika pertama kali membuka layanan di salah satu node cluster. Jika simpul yang dipilih turun, server admin "memindahkan" layanan pada server yang berbeda, memanggil aktifkan () di sana.
http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13952/taskhelp/clusters/ConfigureSingletonService.html
sumber