Aylık Arşiv: Mart 2015

Node.js ile Inotify Event’lerini İşlemek

Geçen gün bir feature (özellik) isteği gelmişti. Bir servis sunucuya bağlanıp bir dosya oluşturacak ve içini dolduracak. Kullanıcıya ise bulunduğu web sayfasında sayfayı yenilemeden bu dosyanın oluştuğundan haberdar edilecek ve tabii sonra bu dosyayı kullanıcı görüntüleyecek.

Direkt 5 saniyede bir AJAX yapıp ilgili dosya oluşmuşsa bir div’e dosyanın oluştuğuna dair mesaj basabilirdim aslında. Ancak olayı biraz daha efektif hâle getirmek istedim. Çünkü AJAX istekleri beraberinde bir dizi overhead getirecekti.

Örneğin; İlgili sayfada 10 kişi olsa, 5 saniyede bir file system‘da yeni dosya var mı diye kontrol yapılması gerekecekti. 10 kişi ayrı ayrı 5 saniyede bir backend’e istek atacaktı. Bu da istediğim bir durum değildi.

Bir diğer problem ise dosyaya yapılan yazma işleminin bittiğinden emin olunması gerek.
Örneğin; AJAX isteği attım. İstekte dosyanın varlığını kontrol ettim. Sonra baktım dosya var mı? Var. Ön tarafa haber saldım “dosya oluştuuuu” diye.
Ama o sırada third-party servis dosyaya veri yazma işlemini bitirmedi. Kullanıcı da “e dosya oluştu madem açayım” derse, sçtık. Çünkü eksik veri görüntüleyecek hatta belki de hata alacak. Sonra ayıkla pirincin taşını.

Bu iş için esas olan “dosyaya yazma işlemim bitti” mesajının gerekliliği. E third-party servis sadece dosya oluşturuyor Gidip bu third-party servisin ekstra bir yerlere mesaj yazmasını da sağlayamam (dosyaya yazdım bitti gibisinden). Hadi yazdırdım diyelim, bir de gidip orayı kontrol etmem gerekecek.

vs. vs. Daha buraya yazmadığım tonla senaryo var bu iş için.

Kısaca bana “dosyayı oluşturdum“, “dosyaya yazdım“, “dosyayı sildim” vs. gibi eventler gerekliydi. Bu bilgileri ise Linux‘ta direkt çekirdekte bulunan Inotify eventleri çok güzel sağlıyor. Yani bilgi sağlam yerden geliyor.

Node.js‘te Inotify eventlerini handle edebilen güzel bir kütüphane var (detaylar, kullanım örneği linkte): node-inotify

node-inotify kütüphanesini ise socket.io ile birleştirip kullanırsanız tadından yenmez (Ben socket.io kullanmıştım, ama siz başka bir kütüphane elbette tercih edebilirsiniz). Çünkü bu şekilde ön tarafa bir socket açıp dosya değişikliklerini bu socket üzerinden yollayabilirsiniz.

Scala ve Java’da ise bu işleri Non-blocking I/O (java.nio) paketiyle yapabilirsiniz.

 
93 Kudos
Don't move