Web sunucusunda statik içerik deposu olarak SQLite kullanımı
Arka plan
- Clace, esas olarak iç araçlara yönelik web uygulamaları sunmak için tasarlanmış bir platformdur.
- Clace, web sunucusu ile uygulama sunucusunun normalde ayrı ele aldığı işlevleri birleştirerek sunar.
- Clace geliştirilirken, uygulama verileri ile meta verilerin nasıl saklanacağına karar vermek önemliydi.
- Meta verileri veritabanında saklamak mantıklıydı; statik dosyalar ise genellikle dosya sisteminde tutulur.
Dosya sunumu için SQLite kullanımı
- Clace, uygulama dosyalarını dosya sistemi yerine SQLite kullanarak saklamaya karar verdi.
- Bu sayede sürüm değişiklikleri atomik hale geliyor; güncelleme sırasında birden fazla dosya tek bir transaction içinde işlenebiliyor.
- Uygulama oluşturma ve güncelleme sırasında tüm dosyalar SQLite veritabanına yükleniyor; geliştirme modunda ise yerel dosya sistemi kullanılıyor.
SQLite kullanmanın avantajları
- Transaction tabanlı güncellemeler: Birden fazla dosya tek seferde güncellenebilir ve güncelleme sırasında bozuk bir web uygulaması oluşmaması garanti edilir.
- Dağıtım geri alma: Hata durumunda dağıtım geri alınabilir; veritabanı transaction rollback işlemi, dosya sistemi temizliğinden daha kolaydır.
- Sürümler arasında dosya tekilleştirme: Aynı dosya birden fazla sürümde bulunsa bile dosya içeriği yalnızca bir kez saklanır.
- Uygulamalar arasında tekilleştirme: Birden fazla uygulamada aynı dosya bulunduğunda tekrarın önüne geçilir.
- Yedekleme kolaylığı: SQLite kullanılarak sistem durumu kolayca yedeklenebilir.
- İçerik hash'leme: Dosya yüklenirken içerik SHA değeri saklanır ve bu da tarayıcı önbelleklemesini kolaylaştırır.
- Sıkıştırma: Dosya içeriği Brotli ile sıkıştırılarak saklanır ve farklı biçimlerde kolayca depolanabilir.
Performans
- Clace'in SQLite veritabanı erişim yaklaşımı oldukça yüksek performans sunuyor.
- Dosya sistemi kullanan eşdeğer bir uygulama olmadığı için doğrudan kıyaslama testi yapılmadı.
- SQLite ekibinin benchmark sonuçlarına göre, bazı iş yüklerinde SQLite dosya sisteminden daha iyi performans gösterebilir.
Çok düğümlü destek
- Clace şu anda tek düğüm üzerinde çalışıyor.
- Çok düğümlü destek eklendiğinde, yerel SQLite yerine paylaşımlı bir Postgres veritabanı kullanılması planlanıyor.
- Bu durum gecikme sorunlarına yol açabileceği için, gecikmeyi azaltmak amacıyla yerel SQLite veritabanının dosya önbelleği olarak kullanılması planlanıyor.
Bu yaklaşım neden yaygın değil
- Çoğu web sunucusunun dosya sistemini kullanmasının nedeni pratikliktir.
- Dosya sistemi araçlarıyla dosya güncellemesi yapılabilir; veritabanı kullanıldığında ise dosya yükleme için bir API arayüzü gerekir.
GN⁺ özeti
- Clace, iç araç geliştirme ve dağıtımı için bir platform olarak SQLite kullanıp dosya depolamanın avantajlarını en üst düzeye çıkarıyor.
- SQLite kullanımı; transaction tabanlı güncellemeler, rollback, tekilleştirme ve yedekleme kolaylığı gibi çeşitli avantajlar sağlıyor.
- Bu yaklaşım, dosya sisteminin sunduğu pratiklik ve tarihsel nedenler yüzünden yaygın olmasa da SQLite'ın performans ve özelliklerinden yararlanarak verimliliği artırıyor.
- Benzer işlevlere sahip projeler arasında Firebase ve AWS Lambda öneriliyor.
1 yorum
Hacker News görüşleri
Birkaç yıl önce "35% Faster Than The Filesystem" yazısından ilham alarak SQLite kullanıp statik dosyalar sunma deneyi yaptım. Datasette aracılığıyla SQLite'tan statik dosya sunan bir eklenti de yaptım, ancak çok fazla kullanmadım. SQLite kullanarak dosya sunmak için
sqlite-utils insert-filesCLI aracı faydalı olabilir.İşlemsel güncellemeler, birden fazla dosyayı tek seferde güncelleyebilmesi açısından önemli bir avantaj sunuyor. Sunucu ister SQLite ister dosya sistemi kullansın, güncelleme sırasında web uygulamasının bozulmasını tek başına engelleyemezsiniz. Sayfadaki tüm alt kaynakların belirli bir içerik hash'i ya da sürüm adı kullanılarak referans verilmesi gerekir.
2011/2012'de küçük bir oyun geliştirme şirketinde çalışırken, tüm varlıkları bir sqlite3 veritabanında saklıyor ve dosyaların ofsetlerini tutan pak dosyaları oluşturuyorduk. Bu sayede mobil oyunda varlıkları hızlı yükleyebiliyorduk; ayrıca metaveriyi veritabanında tuttuğumuz için benzer dosyaları kolayca bulabiliyorduk.
Dosya sistemi yerine SQLite kullanmanın bir avantajı da dosyaları sorgulayabilmektir. SQL sorguları Kysely kullanılarak type-safe şekilde yazılabilir.
SQLite ile statik içerik sunma fikri kusursuz değil. Modern web sunucuları statik dosyaları işlemek için en uygun stratejileri kullanır. SQLite bellek eşlemeli I/O desteği sunar, ancak büyük ölçekli web siteleri için uygun değildir.
SQLite, günde 100K hit'in altındaki web siteleri için uygundur. SQLite'ın kendi web sitesi günde 400K~500K HTTP isteğini işliyor ve çoğu durumda load average 0.1'in altında kalıyor.
Statik site üreteci CMS'ler, web sitesini geliştirmek ve güncellemek için SQLite veritabanı kullanır; ardından dağıtım için statik sayfaları dosya sistemine döker.
Yüksek performanslı bilimsel hesaplamada, verilere erişmenin en esnek ve yüksek performanslı yolu çoğu zaman RAM disk üzerindeki salt okunur bir SQLite veritabanıdır.
Dosya sisteminin tekilleştirme, snapshot, sürümleme ve sıkıştırma sağlayabildiği durumlarla SQLite yaklaşımını karşılaştırmak ilginç olurdu. Gelişmiş bir dosya sistemi kullanıldığında, bir dizini yeni sürümle değiştirmek daha kolay olabilir.
Veritabanını dosya sistemi gibi kullanma yaklaşımının avantajları var, ancak işler ters gittiğinde tam bir kâbusa dönüşebilir.