Dosya sistemi ve veri tabanı bildirimleri

Bu flood’da dosya sistemi ve veri tabanlarında meydana gelen değişikliklerin uygulamalara bildirim yolu iletilmesi ve bu bildirimlerin hangi amaçlarla kullanıldığını anlatacağım.

Gerçek zamanlı bilgiler sunan web uygulamaları (canlı maç sonucu, anlık mesajlaşma, vb) WebSocket yardımıyla web sunuculara bağlantı kurarak sundukları bilgilerde meydana gelen değişiklikleri anlık olarak uygulamaya yansıtabilirler. WebSocket sayesinde tarayıcı üzerinde koşan web uygulamasının değişiklikleri algılaması için sunucuya periyodik olarak istek göndermesi gerekmez. Bu sayede hem sunucu daha az yüklenir hem de değişikliklerin yansıması için bir sonraki sorgulama periyodu beklenmeyeceği için bilgiler daha hızlı yenilenir.

Event bazlı olarak çalışma yukarıda verilen WebSocket örneğinde olduğu gibi kaynakların optimal kullanımını sağladığı için birçok sistem tarafından desteklenir. Bu sistemler üzerlerinde meydana gelen olayları yayınlayarak ilgililerin bunlardan haberdar olmasını sağlarlar.

İşletim sistemleri dosya sisteminde meydana gelen değişiklikleri anlık olarak ilgililerine iletirler. Bu sayede dosya sistemindeki değişikliklerle ilgilenen bir program, bir klasörde yeni bir dosya yaratma, var olan dosyayı değiştirme veya silme gibi işlemlerden haberdar olur. Linux dosya sistemi değişikliklerini inotify API'ı ile iletir. inotifywait ve inotifywatch araçları ile komut satırından inotify API'ını tanıyabiliriz. inotify'ın binding'leri birçok programlama dillinde bulunur böylece inotify uygulama içinden de kullanılabilir.

Aşağıdaki örnekte home klasörü içerisinde bulunan test klasöründe bir dosya oluşturma, dosyaya bir satır metin yazma ve dosyayı silme gibi dosya sistemi hareketleri inotifywait ile izlenerek ekranda gösterilmiştir.

Aşağıdaki örnekte ise yine test klasörü Node.js'te inotify npm paketi yardımıyla izlenmiş önceki örnekteki işlemler tekrarlanarak dosya sisteminden ilgili event'lerin alınabildiği gösterilmiştir.

Dosya sistemi gözlenerek hayat kolaylaştıran birçok işlem rahatlıkla yapılabilmektedir. Örneğin Webpack dev server, ön yüz geliştirmesi yapılırken geliştiricinin değiştirdiği dosyaları monitör ederek web sunucuda içeriği güncelleyip tarayıcıyı WebSocket üzerinden bilgilendirerek sayfanın yenilenmesini sağlar. Benzer şekilde bazı entegre geliştirme ortamları ve editörler dosya sisteminde TypeScript dosyaları oluşturuldukça bu dosyaları transpile ederek JavaScript - ES5 karşılıklarını oluşturabilmektedir.

Uygulama konfigürasyonu değiştirildiğinde uygulamayı yeniden başlatmadan değişiklikleri alabilmek için (her ne kadar artık “best practice” olmasa da) uygulama yapılandırma dosyasındaki değişiklikler izlenerek uygulama konfigürasyonu güncellenebilir.

Dosya sistemini izleme ile ilgili birçok başka örnek verilebilir fakat ne yazık ki bazı dosya sistemleri, özellikle NFS gibi paylaşım için kullanılanlar, bu özelliği desteklememektedir. Sistem tasarımı yapılırken bu kısıtlamanın dikkate alınması önemlidir. Örneğin Vagrant ve VirtualBox ile oluşturulan paylaşımlı klasörde Host OS'te yapılan dosya sistemi hareketleri Guest OS'te, Guest OS'te yapılanlarsa Host OS'te bildirim oluşturmayacaktır. Webpack dev server bu kısıtlamayı belirli aralıklarla poll yaparak aşmaya çalışmaktadır.

Dosya sistemlerinin yanı sıra birçok ilişkisel ve NoSQL veri tabanı da üzerlerinde yapılan işlemleri bildirim olarak ilgililerine aktarabilmektedir. Bilindiği gibi veri tabanları, Trigger adlı mekanizmayla tablolarda meydana gelen yazma, silme ve güncelleme gibi işlemleri iletebilirler. Benzer şekilde Database Driver sayesinde uygulamalarla iletişim kurarak tuttukları tablolarda meydana gelen değişiklikleri uygulamalara aktarırlar. Bu konuda en öncü veri tabanı şüphesiz Realtime Web sloganı ile yola çıkan RethinkDB'dir.

RethinkDB'ye ek olarak popüler veri tabanlarından PostgreSQL, Microsoft SQL Server ve MongoDB de farklı şekillerde ve bazı kısıtlamalarla uygulamaların bir tablodaki veriler veya hazırlanan bir sorgu sonucunda meydana gelen değişiklikleri dinlemesine olanak tanımaktadır. Veri tabanlarında bulunan bu destek sayesinde bir web uygulamasını uygulama sunucusu ile birlikte uçtan uca, ölçeklenebilir şekilde asenkron olarak tasarlamak ve uygulamak mümkün olmaktadır.

Yukarıda anlatılan olay bildirimlerini iletme ve iletilenleri almak üzere kaydolma esaslarını belirleyen Pub-Sub / Publish-Subscribe deseni ve bu desenin diğer uygulama alanlarını (Redis, RabbitMQ) ilerleyen flood'larda ele alacağız.