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.