Bir süredir optimizasyon konuları hakkında yazılar okuyorum ve hala aklımda net bir cevap oluşamadı çünkü böyle bir deneyim sahip olamadım. İlk öncelikle sizlere kullandığım teknolojilerden bahsedeceğim ve sizlerden de anlık olarak ne kadar kullanıcı kaldırabileceğiminin tahminleri öğrenmek istiyorum.
Kullandığım sanal sunucu hakkında bilgi vereyim. Detaylı bakmak isteyenler olursa contabonun vps m ssd paketine bakabilir.
Özellikleri
6 CPU core
16 GB RAM
400 GB disk space (100% SSD)
400 Mbit/s port
İşletim sistemi olarak ubuntu 16.04 kuruludur.
Apache Web Server ve Apache Tomcat kullanmaktayım.
Toplamda 2 adet internet sitesi barındırıyorum ve bunlara aşırı bir talep olmuyor. Aylık 100 kişi girse şaşırırım.
Yazılım Dili
Kullandığım yazılımlar ise Java ve onun spring boot isimli bir frameworkü. Projelerim dağıtık mimari denilen bir yapıyı benimsiyor. Her ne kadar hepsi tek bir sanal sunucu üzerinde barınsada her bir mikroservisim projenin bir ayağını yönetiyor. Birinde sorun oluştuğunda diğerleri çalışmaya devam ediyor.
Toplamda 6 adet mikroservis bulunmaktadır ve her mikroservis 120-150 MB civarında ram tüketimi yapmaktadır. Bu projelerde memory leak analizi yaptım ve pek bir sıkıntı görmedim. 1 Ay boyunca sunucuda çalıştılar ve 150 mb üzerine çıkmadılar. Garbage collector gereksiz yere devreye girmedi. Elimden geldiğince temiz ve framework'e göre kodlamaya çalıştım.
Cache
Redis cache kullandım. Ortalama her 48 saatte bir tüm cache siliniyor. Cache sürekli şişmemesi için düzgün bir yapı kurduğuma inanıyorum. Cache sayesinde database'e gidecek olan istek sayısını azaltmayı hedefledim.
Database
Database olarak MySQL tercih ettim, hem ilişkisel bir database'ye ihtiyaçım vardı hem de biraz olsun bildiğim bir yapıydı. Şimdilik en kalabalık tablom 220 mb ve toplamda 550k satır bulunmaktadır. Text-search işlemi sadece bir sütündaki isme göre yapılıyor. Databasede hiç bir şekilde tüm veri taşınmıyor. Maksimum LIMIT 100'dür. Projelerimde hikari connection pool kullandım böylelikle daha rahat konfigürasyon yapabileyim.
Her mikroservisin açabileceği maksimum connection sayısı 15'dir. Fazla olunca ram tüketimim artıyor ama bu konuda tavsiyelerinize kesinlikle açığım. Eğer isterseniz yaptığım konfigürasyonları direk sizlerle paylaşabilirim.
SQL Querylerim kötü değil, genellikle Hibernate aracılığıyla db'ye dokunduğum için burasının performanslı olduğunu düşünüyorum.
Güvenlik
Sanal sunucular konusunda ne yazık ki pek deneyimim yok ama logları takip ederek ilerleyen biriyim. Fail2ban kurdum. 12-13 port dışında kullanmadığım ve dışarıdan gelen tüm istekler DROP şekilde firewalldan ayarladım. Projelerim token tabanlı bir alt yapıya sahip ve her token 8 saat sonunda ömrünü tamamlıyor. Default portları değiştirdim.(SSH) SSH'e key ile bağlanıyorum. Cloudflare kullanmaktayım.
Sunucuda rol yapısı kurdum. Her mikroservis projesi bir kullanıcı tanımlı. Bu kullanıcı diğer kullanıcılara dokunamaz sadece ona tanımlı dosya üzerinde hareket edebilir. Aynı olayı MySQL içinde gerçekleştirdim.
Front-End
2 site var ve bu sitelerden biri saf html-css kullanıldı. Diğeri ise Angular 9 kullandım. Bunda da ayrı bir cache yapısı kullandım. Tekrar tekrar isteklerde aynı yerler kullanılmıyor. Gereksiz css-js'lerden kurtuldum. Trafik https üzerinden akıyor.
Burada soru varsa cevaplarım.
Sunucuda bunlar dışında bir iki deployment araçları(Jenkins,Docker) kurulu.
Elimden geldiğince net ve anlaşılır olmuşumdur umarım. Şuan sunucuda ram tüketimi 2.1 GB , geri kalan boştadır. Sorum konunun başında olduğu gibi aynı, eşzamanlı kaldırabileceğim kullanıcı sayısı kaçtır ? Aynı anda 1k kullanıcı istek atıp 1 saat boyunca tempolu kullanırsa sistemin çökme durumu olabilir mi ? Biliyorum bunlar test edilmeden cevap verilmesi zor sorular ama sizlerin deneyimlerinize göre de düşüncelerinizi öğrenmek istiyorum. Öğrenme aşamasında biriyim bunu göz önüne alın lütfen