Bir sunucu kümesinde yalnızca bir kez çalıştırmak istediğiniz bir göreviniz olsaydı, düzenli aralıklarla bunu başarmanın en iyi yolu ne olurdu? Bu durumda kümenin tanımı, bir yük dengeleyicinin arkasında oturan dağıtılmış oturumlara sahip 2 veya daha fazla özdeş sunucudur.
Kullanım Örneği: Çalıştırılması pahalı olan ve her X saatte bir çalıştırılması gereken bir göreviniz var. Bu iş, örneğin bir grup kaydın üzerinde yineleme yapabilir ve durumlarını güncelleyebilir.
- En kötü senaryo, işin iki kez çalıştırılmasının verilerinizi geçersiz kılmasıdır.
- En iyi durum senaryosu, işin tüm sunucularınızdaki kaynakları kullanmasıdır.
Gereksinim Özeti:
- Düğümlerden biri kapalı olsa bile işin devam etmesi gerekir.
- İş, her zamanlama için yalnızca bir kez çalıştırılmalıdır.
- Aynı anda veya çakışan zamanlarda birden fazla iş planlanıyorsa, çalışan iş sayısının sunucular arasında eşit olarak dağıtıldığı durumlarda.
- Makineler aynı kod tabanına sahip olmalı ve NTP üzerinden senkronize edilmelidir.
- Yapılandırma, ortam değişkenlerine göre düğüm ve düğüm arasında farklılık gösterebilir.
- İşin zamanında veya belirlenen zaman aralığında başlaması gerekir. (örneğin 5 dakika deyin)
Muhtemel çözümler
- Bir düğümü ana düğüm olarak ayarlayın, bu yukarıdaki 1'i ihlal ettiği için çalışmaz.
- Yük dengeleyicinin işi başlatmak için dengelenmesini talep edin. Ne yazık ki, aynı anda birden fazla işiniz varsa, hepsinin aynı makine tarafından çalıştırılabileceği yan etkisi vardır.
Bunun Java'da, bir sunucu uygulaması kapsayıcısında çalışması gerekir. Ancak aradığım işleri kodlamıyor.
Elbette bu bilinen en iyi çözümle çözülmüş bir sorundur.
İlgili soru. /programming/5949038/schedule-job-executes-twice-on-cluster
Yukarıda belirtilen 5 gereksinime göre çözüm yetersiz olduğu için bu bir kopya değildir. En çok oylanan çözüm bir yarış probleminden muzdarip ve ikinci çözüm gereksinimi 3 ihlal ediyor