İhtiyaç: Mobil uygulama, kullanıcı bilgilerinin v.s. tutulacağı bir veritabanı ve bu veritabanıyla mobil uygulama arasında iletişim kuracak bir servis
Çözüm alternatifleri:
Tercih ettiğim çözüm: Faas (Google Cloud Functions)
Tercih sebebi: Maliyet + Yönetim Kolaylığı
Daha önce tercih ettiğim çözümler ve çıkan sorunlar:
İlk mobil uygulamamı geliştirirken uygulamanın kullanacağı servisi seçme konusunda odaklandığım tek nokta kod idi. O dönemler kendimi en güçlü hissettiğim dil C#. Buna bağlı olarak geliştirme ortamım Microsoft Visual Studio ve seçtiğim veritabanı ise MsSQL oldu. Web servisi kodlayıp veritabanına bağlamak kısmında herhangi bir zorluk yaşamadım. Microsoft Visual Studio bu konuda çok güçlü bir tool. Uygulama IOS uygulaması olduğu için de ön yüz geliştirmesi için Xcode kullandım.
Buraya kadar her şey güzel tabi ama sorunlar bundan sonra başlıyor. Web servisi yazdıktan sonra bu servise lokalden değil de internet ortamından erişebilmem için şunlara ihtiyacım vardı; domain + hosting + IIS server. Domain konusunda çok sıkıntı yaşamadım. Hosting için önceleri VPS sunucu kiralayıp üzerine Windows Server kurarak çözmeye çalıştım. Fakat sunucu bazı zamanlar downtime yaşadı, bir defa hacklendi, bir defa virüs girdi, IIS server durdu, bellek sorunları yaşadım, bazı zamanlar işlemci yetersiz kaldı, bir defa da backuptan döndü. Bunun gibi bir çok sorundan sonra hosting hizmeti almaya karar verdim. Hosting hizmeti alınca MsSQL veritabanında bana 200MB yer verdiler bir gün baktım veritabanında yer kalmamış. Log dosyaları yarısını kaplıyor. Veritabanı log dosyasını sileyim dedim komutu çalıştırmak için yetkim yok 🙂
Çözüm:
Bu kadar basit bir ihtiyaç için bu kadar maliyet ve bu kadar sorun fazla geldi. Araştırma yaparken ihtiyacım olanın FaaS olduğuna karar verdim. Kodumu yazarım gerisine karışmam dedim. Ayrıca ücretsiz plan da benim için yeterli idi. Maliyet basit bir uygulama için neredeyse 0 (Sıfır). Google servisi olan Cloud Functions ve Cloud Firestore (NoSQL) ücretsiz planda kullanabileceğimiz limitler aşağıdaki gibidir. Limitleri aştığınızda da “Pay as you go” paketiyle kullandığınız kadar ödeyebiliyorsunuz, yani servisleriniz durmuyor.
Neden NoSQL:
Burada NoSQL kavramına girip konuyu uzatmayacağım. Normalizasyona ihtiyacım olmadığı için, denormalizasyon yapma konusunda sıkıntım olmadığı için, en önemlisi de yatay büyümeye imkan verdiği için maliyetlerin çok düşmesi sebebiyle Cloud Firestore’u tercih ettim. Ayrıca mobil uygulamadan bazı durumlarda veritabanına direk erişim yapıp okuma ve güncelleme işlemlerini yapabiliyor olmam da yazdığım kod satırlarını minimuma indirdi. Yetkilendirmeyi de tek satırla çözdüm.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{burası güvenlik için gizli}/{uid} { allow read, update, create, delete: if request.auth.uid == uid; } } }
Sonuç:
Daha az satır kod, daha az baş ağrısı, esneklik, takip edilebilirlik, izlenebilirlik