How to use Criteria & Metamodel API with Spring Boot to create dynamic queries
Sometimes you may need to create your sql queries on runtime with some specification given by your client. In these cases, you may create many JPQLs …
Yazılım geliştiriciler olarak günümüzün çoğunu kod yazarak geliştiriyoruz. Kimimiz kendi projesini geliştirirken, kimimiz çalıştığı şirketler adına geliştirmeler yapıyor. Çoğu zaman sadece bizlere verilen geliştirmeleri yapıyor, sonrası ile pek igilenmiyoruz. Fakat günümüzün web mimarileri pek çok bileşenin bir araya gelmesinden oluşuyor. Bu mimarinin büyük resmini görmek veya en azından temel seviyede bilmek çok önemli. Bu yazıda temel olarak modern web mimarisinin bileşenlerini anlatacağım.
Yukarıdaki resim temel olarak arka planda gerçekleşen olayları anlatıyor. Tabikide bu akış şirketten şirkete değişikliği gösteriyor, ve genellikle kişisel projelerimizde buradaki pek çok akış bizleri ilgilendirmiyor.
Şimdi kullanıcının tarayıcıya web adresinizi yazdıktan sonra neler olduğuna sırayla bakalım.
Her şeyden önce kullanıcının bilgisayarı sadece web adresine (örneğin: https://hackathonturkiye.com/) bakarak nereye gideceğini bilemez. Çünkü internet ortamında haberleşme IP adresleri üzerinden gerçekleşir. Web adresinizden IP adresinize ulaşmak için devreye DNS(Domain Name System) araya giriyor. Temel olarak bilgisayarınız DNS resolver’a benim kullanıcım https://hackathonturkiye.com/ isimli bir yere bağlanmak istiyor, bana bunun IP adresini ver ki ben de gidip bağlantı sağlayıp, kullanıcıma gerekli veriyi (bu durumda html sayfası olacak) göstereyim.
Çok bilinen DNS resolver adresleri olarak Google DNS adreslerini verebiliriz: 8.8.8.8 ve 8.8.4.4
Not: Eğer basit bir web uygulaması geliştiriyorsanız çok büyük olasılık load balancer ile uğraşmayacaksınız.
Kullanıcının bilgisayarı IP adresini öğrendikten sonra size isteklerini göndermeye başlayacak ve bu büyük şirketlerde genellikle load balancer’ın IP adresi olacaktır.
Load Balancer en temelinde bir reverse proxy sunucusudur. Öncellikle proxy sunucusunun ne iş yaptığından bahsedelim. Bir proxy sunucusu, kullanıcı ve bağlanmak istediği web sitesinin arasına girer. Basit bir örnekle anlatmak gerekirse, mesela hackathonturkiye.com adresine proxy sunucusu aracılığı ile bağlanmak istiyorum diyelim, proxy sunucusuna şunu diyorum:
Peki neden isteği proxy sunucusunun yapmasını istiyoruz, bunun için pek çok sebep sayılabilir:
Reverse proxy ne oluyor peki ? Ben nasıl istek yaparken gizli kalmak istiyorsam, hackathonturkiye.com’da kendi ip adreslerini istek yapan kullanıcılardan saklamak isteyebilir. İşte bu durumda araya reverse proxy giriyor. Şöyle düşünün hackathonturkiye.com’un 2 veya daha fazla sunucusu var, kullanıcılar bağlanırken bu iki adresten birine istek atmaları lazım. Fakat bu 2 adresi internet ortamında göstermek yerine bütün kullanıcıları tek bir adrese yönlendirip (reverse proxy sunucusunun adresi) daha sonra istekleri kendi sunucularına yönlendirebilir. Peki bunun ne gibi yararları var:
Şimdi bu reverse proxy’i biraz daha akıllandıralım. Örneğin reverse proxy, istekleri yönlendireceği 2 sunucu makinesini sürekli kontrol etsin ve şu gibi özelliklere sahip olsun:
Bu ve daha çok bir çok özelliğe sahip olanlar Load Balancer olarak adlandırılıyor. Yani Load balancer kullanma sebebi, şirketlerin herhangi bir sunucuları çöktüğünde gelen istekleri diğer makinelere dağıtmak ve olası sunucu çökmelerinde direkt haberdar olmak. Eğer daha fazla bilgi almak istiyorsan Citrix Netscaler diye google’da aratabilirsiniz. (Load balancing işlerinde kullanılıyor)
Kullanıcılarınızın isteklerinin gerçekleşeceği yere geldik. Burada artık kullanıcı üye girişi yapmak isterse bu işlemi gerçekleştiriyoruz, görmek istediği sayfayı gösteriyoruz vs..
Burada kullanılan bir kaç araç: Spring Framework, Django, Nodejs, Laravel vs..
Not: Eğer basit bir websiteniz varsa muhtemelen aynı makine üzerinden hem web uygulamanız hemde database sunucunuz çalışacak.
Kullanıcılarınızın verilerinin depolandığı yer. Burada SQL (MySQL, PostgreSQL gibi) ve/veya NoSQL(MongoDB) gibi çözümler kullanabilirsiniz. Websiteniz ne kadar büyükse bu kısımda o kadar büyük oluyor. Bir makineye bütün bilgileri sığdırmak imkansız olduğu için, genel olarak burada bir çok makine(sunucu) bir araya gelerek bir küme oluşturuyor ve web uygulaması bu kümeye istek atıyor. Bu küme kendi aralarında konuşarak backup ve daha pek çok işlemleri gerçekleştiriyorlar.
Not: Eğer basit bir websiteniz varsa muhtemelen bu kısım ile uğraşmayacaksınız.
Süre alan işlemlerin sürekli ve sürekli yeniden yapılması yerine bir map
yapısında saklayıp O(1)
işlem zamanında hızlı sonuç döndürmek için caching sunucuları kullanılır. Burada asıl amaç kullanıcılarınıza hızlı bir şekilde geri dönüş sağlamaktır.
Örneğin https://hackathonturkiye.com/ sitesinde listelenen hackhathonların database’den okunup ekrana basıldığı ve database’den okuma işlemin uzun sürdüğünü(sonuçta aynı zaman aralığında pek çok hackathon gerçekleşiyor) varsayalım. Bu durumda sürekli database gidip okuma yapmak yerine listelenen hackhathon verilerini bilgisayarın hafızasında saklayıp, daha sonraki isteklerde sonucu bilgisayarın hafızasından direk alabiliriz.
Örnek olarak Redis veya memcache araçlarına bakabilirsiniz.
Not: Eğer basit bir websiteniz varsa muhtemelen bu kısım ile uğraşmayacaksınız.
Bazı isteklerin arka planda kullanıcılardan veri girişi beklemeden çalıştırılması gerekiyor (asenkron bir şekilde). Bu istekler direk olarak kullanıcıların doğrudan yaptığı istekler değil.
Mesela şunun gibi bir istek: Her gün saat 17:00’da mail listesine kayıtlı olan tüm kullanıcılara yeni gelen hackhaton’ları mail at, job sunucularında gerçekleştirebilir.
Örnek olarak Luigi, Azkaban veya Oozie gibi araçlara bakabilirsiniz.
Websitelerinde arama kutucuğuna bir şeyler yazdığımızda bize en anlamlı sonuçları göstermeye başlarlar. Örneğin hepsiburada.com’da arama kutucuğuna sam yazdığınızda samsung yazısının çıkması gibi. Bu işlemler bir veye daha fazla makinede çalışan araçlar sayesinde gerçekleşiyor. Örnek olarak Elastic Search, Apache Solr araçlarına bakabilirsiniz.
Burada temel bileşenlerden bahsetmeye çalıştım, fakat bunlarla sınırlı değil, örneğin websitenizdeki veriler ne kadar büyükse, veriler üzerinde analizi bir makine üzerinden gerçekleştirmek o kadar zor oluyor. Bu gibi durumlar büyük veri araçları Apache Spark , Apache Hadoop ve benzeri araçlar kullanılıyor.
Sometimes you may need to create your sql queries on runtime with some specification given by your client. In these cases, you may create many JPQLs …
It is crucial to capture long running method execution in your application (whether it is an API or traditional mvc application). You should also …