Bir servisten on dakikada bir veri okuyup bazı işlemler yapılmasını gerektiren bir entegrasyon programı yazmam istendi. Buna benzer başka ihtiyaçlar da olacağı için zamanlanmış görev yöneticisi yazmanın daha iyi bir fikir olduğuna karar verdim ve Hangfire kullanan bir asp.net core mvc uygulaması yazdım. Hangfire, asp.net uygulamalarınıza nuget paketi olarak ekleyip zamanlanmış görevlerinizin çalışmasını sağlayabileceğiniz bir kütüphanedir.
IIS’te çalışan uygulamamız, dakikada bir çalışan bir test görevi olmasına rağmen 30 dakikada bir uyku moduna geçmeye başladı. Ben de buna çözüm aramaya başladım.
IIS’te yapılan ayarlar
Normal şartlar altında aşağıdaki ayarları yapınca problemin çözülmesi lazımdı:
- IIS’teki uygulamanın Preload Enabled ayarının True yapılması
- Uygulamanın kullandığı Application Pool’un Start Mode’unu Always Running yapılması
- Application Pool’un refresh settinglerinin hepsinin pasif hale getirilmesi.
Bunları hiç biri çözüm olmadı.
Ping de çözüm değil
Uygulamamızın uptime’ı 3. parti bir platform tarafından izlenmekteydi. Uptime, ping atılarak kontrol edilir. Ping atıldığı halde uygulamanın neden uyku moduna geçtiğini ilk başta anlayamadım. Daha sonra ping’in uygulamayı değil host’u kontrol ettiğini hatırladım(bu da benim dikkatsizliğim)
Curl ile gelen çözüm
Henüz kalıcı bir çözüm bulamadım ama krizi engellemem gerekiyordu. Çünkü uygulama ödemelerle ilgiliydi. Bunun için eğer sayfa belirli aralıklarla görüntülenirse uygulama ayakta kalır düşüncesiyle aşağıdaki powershell scriptini yazdım:
$url = “https://api.ipify.org?format=json”
$interval = 10
while (1) {
Start-Sleep -seconds $interval
Clear-Host
Write-Output “curled $($url) at $(get-date) `n”
Invoke-WebRequest $url
};
While döngüsünün içindeki ilk satır, kodun çalışmasını $interval değerindeki kadar saniye bekletmektedir.
Invoke-WebRequest ise curl programı için bir wrapper’dır. Unix zamanlarından beri var olan curl programı basitçe bir http kaynağına get isteği gönderir ve çıktıyı ekrana yazdırır.
Clear-Host her seferinde ekranı temizlerken, Write-Output ile başlayan satır son işlem zamanını ve hangi adrese curl yapmakta olduğumuzu gösterir.