Uygulama Sunucuları

Deniz Arıkan
Akbank Teknoloji
Published in
10 min read19 hours ago

Uygulama Sunucusu Nedir?

Uygulama sunucusu (application server, app server), uygulamaları çalıştırmak ve yönetmek için ortam sağlayan bir yazılım platformudur. Son kullanıcılar/istemciler ile back-end sistemler veya veri tabanları arasında aracı görevi görür. Bir uygulama sunucusunun en öncelikli amacı; uygulamaları çalıştırmak, yönetmek ve bir ağ üzerinden istemcilere sunmaktır.

Bu sunucular web uygulamalarını ve hizmetlerini yüklemek, çalıştırmak ve barındırmak için özel olarak tasarlanmışlardır. Ana işlevi; uygulamaların geliştirilmesi, yürütülmesi ve yönetimi için bütünleşmiş bir ortam sağlamanın yanı sıra, uygulamaları veri tabanlarına, web servislere, kuyruklara ve gerekli durumlarda farklı protokoller ile dış sistemlere bağlamanın karmaşık görevini kolaylaştırmaktır.

Bir uygulama sunucusunun en güçlü yanı, iş mantığını sunucu tarafında yürütme yeteneğidir. Bu, istemci isteklerini (örneğin bir web tarayıcısı veya mobil uygulama) işleyebilecekleri, veri tabanı sorguları, hesaplamalar veya veri işleme gibi karmaşık işlemleri gerçekleştirebilecekleri ve sonuçları istemciye geri gönderebilecekleri anlamına gelir. Böylece uygulama sunucusu, istemci cihazlardaki iş yükünü hafifletir ve iş mantığının merkezi yönetimine olanak tanır.

Uygulama Sunucusu Kullanmanın Avantajları Nelerdir?

Uygulama sunucu tipleri ve teknolojileri arasında farklılıklar olsa da bu platformların sağladıkları temel bazı özellikler ve getirdikleri ortak avantajlar vardır. Bu özellikler sayesinde uygulamaların çalışabileceği hazır bir ortam sunarak, geliştirilen projelerde yapılacak işe odaklanılmasını sağlarlar.

Yönetim Kolaylığı: Uygulama sunucuları uygulamaları deploy etmek, çalıştırmak ve yönetmek için merkezi bir ortam sağlar. Bu durum sunucu ve uygulama konfigürasyonlarının yönetimi, performans izleme ve güvenlik için tek bir kontrol noktası sağlayarak yönetimi basitleştirir.

Performans ve Ölçeklenebilirlik: Kaynakları verimli kullanarak, yükü dengeleyerek ve oturum yönetimi yaparak uygulama performansını optimize edilmesini sağlarlar. Ayrıca, uygulama sunucuları yatay ölçeklenebilirliğe olanak tanırlar; bu sayede kurumsal uygulamalar yüksek performans düzeyini korurken yüksek hacimli trafik ve iş yüklerini yönetmek gerektiğinde daha fazla sunucu kolaylıkla eklenebilir.

Transaction Yönetimi: Transaction tek bir parçaymış gibi (atomik) işlenerek bitmesi gereken iş/iş grubu demektir. İş grubunun başarılı bitmesi durumunda, yapılan işlerin beraber commit’lenmesi, iş grubu içinde herhangi bir anda sorun çıkması durumunda ise transaction başlangıcından hata anına kadar gelen kısmın tamamen iptal edilmesi gerekir. Bir işlemin transaction olması için ACID (Atomicity, Consistency, Isolation, Durability) prensiplerine uyması gereklidir.

Uygulama sunucuları, gelişmiş transaction yönetimi sağlayarak veri tabanı işlemlerinin güvenli ve tutarlı bir şekilde tamamlanmasını sağlarlar. Bu, veri bütünlüğünün çok önemli olduğu bankacılık veya hassas veri yönetimi gibi kritik işlemleri gerçekleştiren uygulamalar için çok önemlidir.

Entegrasyon Kolaylığı ve Birlikte Çalışabilirlik: Uygulama sunucuları başka uygulamalar, sistemler ve veri tabanları ile kolay entegrasyon yapılması için tasarlanmıştır. Bu sayede farklı sistemlerle (veri tabanı, MQ vb.) erişmesi gereken uygulamaları çalıştırmak çok daha kolay olur. Örneğin uygulama sunucusu üzerinde çalışan ve veri tabanı bağlantısı ihtiyacı olan bir uygulama, sunucunun sağladığı bağlantı havuzunu (connection pool) kullanarak veri tabanı işlemlerini kolaylıkla yapabilir.

Güvenlik: Kimlik doğrulama (authentication), yetkilendirme (authorization), güvenli oturum yönetimi ve veri şifreleme gibi güçlü güvenlik özelliklerini içerirler. Bu fonksiyonlar uygulamaların ve verilerin yetkisiz kişilerce erişimine engel olur ve diğer güvenlik risklerine karşı korunmasına yardım eder.

Yük Dağılımı: İstemcilerden gelen isteklerin sunucular arasında eşit bir şekilde dağıtılmasını sağlayarak yoğun yükler altında bile performansın kötüleşmemesini sağlarlar.

Cache’leme (Önbellek): Cache mekanizmaları kullanılarak uygulama performansı daha da iyileştirilebilir. Uygulama sunucusunun bir uygulamayı yüklerken ve çalıştırırken çoğu zaman veri tabanına arka arkaya istekler atması gerekir. Bu da toplam işlem süresinin artmasına neden olur. Eğer uygulama sunucusu sık erişilen verilerin bir kısmını önbellekte saklarsa, bir istek alındığında veri tabanı sunucusunu beklemek zorunda kalmadan bu verilere anında erişilebilir.

Uygulama Sunucusu ile Web Sunucusu Arasındaki Farklar Nelerdir?

En basit haliyle web sunucuları; HTML sayfaları, resimler, videolar, CSS ve scriptler gibi statik içerik sunarken uygulama sunucuları ise üzerinde çalışan uygulamalar sayesinde müşteriye özel data veya bu verinin online güncellenmesi gibi dinamik içerik sunarlar. Bu içeriği sunmak için uygulama mantığını çalıştırır ve çeşitli kaynaklarla entegrasyonunu (bütünleşmesini) mümkün kılarlar.

Çok genel tanımla web sunucularına istek olarak HTTP veya HTTPS protokolü ile bir web sayfası talebi gelir ve sunucu bu içeriği gereken resim, video ve diğer nesneler ile istemciye sunar. Uygulama sunucuları ise gerekirse HTML içerik de sunabilirler ama bu sunuculara istekler çoğu zaman REST, SOAP, GRPC gibi web servis protokolleri ile gelir. Uygulama sunucusu gelen isteği karşılar, ihtiyaca göre veri tabanı, kuyruk veya başka web servislere ulaşarak bir içerik oluşturur ve istemcilere cevabı döner.

Uygulama sunucusu ile web sunucusu arasındaki fark her zaman net olmayabilir. Örneğin Java dünyasındaki 2 popüler sunucu olan Tomcat’in ve JBoss’un özelliklerini karşılaştırırsak şöyle bir değerlendirme yapabiliriz: Tomcat’in HTTP sayfalarını sunma ve Servlet çalıştırma özelliği bulunur. Servlet çalıştırma özelliği sayesinde bir miktar dinamik içerik sunabilse de bu Tomcat’i tam bir uygulama sunucusu yapmaz. Öte yandan JBoss ise transaction desteği için EJB container, kuyruk erişimi için JMS (Java Messaging Service) ve veri tabanları için JPA (Java Persistence API) gibi Java EE özelliklerini desteklediğinden tam anlamıyla bir uygulama sunucusudur.

Uygulama Sunucuları ile Veri Tabanları Arasındaki Farklar Nelerdir?

İstemci — sunucu mimarisinde uygulama sunucuları ile veri tabanları birbirini tamamlayıcı ancak ayrı roller üstlenirler.

Uygulama sunucusu öncelikle iş mantığını veya uygulama mantığını barındırır ve çalıştırır. Oturumları (session) yönetmek ve istemci tarafı ile arka sistemler arasındaki iletişimi kolaylaştırmak gibi görevleri yönetir.

Bir veri tabanı sunucusu ise, verileri depolamak, yönetmek ve almak konusunda uzmanlaşmıştır. Veri depolama, alma, sorgulama ve özellikle transaction yönetimi gibi hizmetler sunarak uygulamaların yapılandırılmış verilere kolayca ulaşmasını sağlar.

Web ve Uygulama Sunucularının Mimarideki Yeri

Yüksek istek sayısı ile çalışan kurumsal uygulamalarda, gelen talebi karşılamak için çoğu zaman web sunucuları ile uygulama sunucuları en basit hali ile aşağıdaki şekilde konuşlanırlar.

Bu yapı sayesinde basit statik web istekleri, web sunucusu tarafından karşılanır ve uygulama sunucusu bu yükü karşılamadan sadece uygulamanın gerektirdiği dinamik içeriği oluşturur.

Elbette gerçek kullanımda yapı biraz daha farklıdır. Yüksek TPS (Transaction Per Second) ile çalışan kurumsal uygulamalarda gelen istekleri dengeleyip istemcilere kısa sürede cevap verilebilmesini sağlamak için hem web hem de uygulama sunucularının sayısı artırılır ve aralarına yük dengeleyici bileşenler eklenir.

En Çok kullanılan Web / Uygulama Sunucuları ve Teknolojileri

IIS

IIS (Internet Information Services), Microsoft tarafından getirilmiş bir web sunucusudur. İşletim sistemi olarak Windows kullanan web sunucularında bulunur ve Asp.Net web uygulamalarının kolaylıkla çalıştırılmasını sağlar. İlk sürümü 1995 yılında çıkan IIS HTTP, HTTPS, FTP ve SMTP protokollerini destekler.

NGINX

İlk olarak 2004 yılında yayınlanan NGINX, açık kaynak ve ücretsiz bir web sunucusudur. NGINX aynı zamanda yük dengeleyici ve ters proxy olarak da kullanılabilir. Web sunucusu olarak statik içerik sunmanın yanında CGI (Common Gateway Interface) ve script’leri kullanarak dinamik içerik de üretebilir. Çoğu sunucudan farklı olarak NGINX, istekleri işlemek için thread’ler yerine asenkron event driven bir yaklaşım kullanır.

Apache Tomcat

Apache Tomcat ücretsiz ve açık kaynak bir HTTP sunucusudur. İlk sürümü 1999 yılında yayınlanan Tomcat daha çok Java teknolojileri ile geliştirilen web uygulamalarını sunmak için kullanılır. Özellikle hafif ve bellek ihtiyacı düşük (low memory footprint) uygulamalar için idealdir. Servlet ve JPS (Java Server Pages) desteği bulunur.

Jetty

Eclipse Jetty, Eclipse Foundation tarafından geliştirilen açık kaynak ve ücretsiz olan bir web server ve Java Servlet container’dır. HTTP/3,2,1 ve WebSocket gibi endüstri standardı olmuş çok sayıda protokolü destekler. İlk olarak 1995’te bağımsız olarak geliştirilen Jetty, 2009’da Eclipse’e dahil olmuştur.

GlassFish

İlk sürümü 2005’te Sun Microsystems tarafından yayınlanan GlassFish, açık kaynak ve ücretsiz bir uygulama sunucusudur. Transaction yönetimi, Message Queue (MQ) erişim desteği vb. konuları destekleyerek kurumsal Java uygulamalarının çalışacağı güvenilir bir ortam sunar.

JBoss

IBM’in alt şirketlerinden biri olan Red Hat tarafından Java’da geliştirilen ve desteklenen son derece kuvvetli ve yüksek transaction sayısına sahip kurumsal uygulamaları güvenilir olarak çalıştırabilen bir uygulama sunucusudur. JBoss Enterprise Application Platform (JBoss EAP) istek ve ihtiyaca göre abonelik tabanlı veya açık kaynak/ücretsiz olarak kullanılabilir. İlk sürümü 1999 yılında yayınlanmıştır.

WebLogic

Oracle WebLogic Server, Java’da geliştirilmiş kurumsal uygulamaları konuşlandırmak ve çalıştırmak için tasarlanmış bir platformdur. WebLogic Server, Java Enterprise Edition (EE) ve Jakarta EE standartlarını destekler. Sunucunun kendisi de Java dilinde geliştirilmiştir. İlk olarak BEA Systems tarafından 1997’de geliştirilen WebLogic sunucusuna Oracle, bu şirketi 2008 yılında satın alarak sahip olmuştur.

WebSphere Application Server

WebSphere Application Server (WAS), IBM tarafından geliştirilen, Jakarta EE (Java EE) standartlarını destekleyen ve Java bazlı uygulamaları çalıştıran bir uygulama sunucusudur. İlk sürümü 1998 yılında çıkan WAS, kurumsal uygulamaları çalıştırmak için sık tercih edilen uygulama sunucularından biridir.

Havuz Problemi

Uygulama sunucularına ait özellikler arasında en önemlisi, bir başka deyişle uygulama sunucularının alametifarikası, sunucuya ait kaynakların havuz mantığı ile yönetilebilmesidir. Bu özellik sayesinde sunucular ellerindeki thread, veri tabanı bağlantısı ve benzeri kaynakları kendilerine ait bir “havuz”da tutarlar ve her seferinde yeniden oluşturmanın maliyetini yüklenmeden bu kaynaklara ihtiyaç duyan istekleri karşılarlar.

Örneğin kurumsal uygulamalar çoğu zaman her biri kısa bir süre için çalışan sonrasında da yok olan çok sayıda iş parçacığından oluşur. Bu işleri yapmak için bir thread havuzu (thread pool) kullanmak thread oluşturma ve yok etmeyle ilgili ek yükü kaldırabilir ve thread yönetiminin karmaşıklığını azaltabilir.

Benzer şekilde bu uygulamaların kullanıcıdan gelen isteklere cevap vermek ve işledikleri verileri kalıcı hale getirmek için veri tabanı erişimi ihtiyaçları bulunmaktadır. Sunucular, ağ üzerinden ilgili veri tabanına her seferinde bağlantı açmak yerine bu bağlantıları sayısı belli olacak şekilde bir havuzda (connection pool) tutar ve uygulamadan gelen istekleri buradan karşılar.

Bu yapının iki avantajı vardır. Öncelikli olarak her seferinde veri tabanı ile bağlantı kurma maliyetini ortadan kaldırırlar. Yüksek TPS’li (Transaction Per Second) uygulamalarda bu maliyetin ortadan kaldırılması kritiktir. İkinci olarak da uygulamadan kaynaklı bir hata nedeniyle veri tabanına kontrolsüz bir şekilde bağlantı açılmasına ve veri tabanı sağlığını tehdit etmesine engel olurlar. Böyle bir durumda uygulama, bağlantı havuzu dolu hatası alır ancak veri tabanı korunmuş olur. Uygulamanın getireceği yüke ve uygulama için gereken performansa bakılarak bağlantı havuzlarının açılış ve maksimum adetleri ayarlanabilir.

Adım Adım Yapılan İşlemler

1. İstemci tarafından bir istek web sunucusuna iletilir. Bu isteği yapan bir web tarayıcısı, bir desktop veya mobil uygulama olabilir. Çoğu zaman bu istek HTTP veya HTTPS protokolleri ile yapılır.

2. İstemciden gelen bu isteği web sunucusu karşılar ve dinamik içerik talep edildiği için uygulama sunucusuna gider.

3. Uygulama sunucusu gelen istek üzerinde iş ve uygulama mantığını çalıştırır. Gerekiyorsa veri tabanına erişir, farklı uygulama sunucularına web servis çağrısı yapar veya tanımlı kuyruklardan bilgi okur veya yazar.

4. Uygulama sunucusu tarafından erişilen veri tabanı talep edilen bilgileri toplar, web servislerden geren bilgiler dönülür veya kuyruk işlemleri tamamlanır.

5. Uygulama sunucusu bütün bu bilgileri alır, düzenler ve gerekiyorsa iş mantığı çalıştırarak zenginleştirir. Gelen HTTP isteğine bir cevap oluşturur.

6. Web sunucusu bu cevabı alır ve talebi yapan istemciye uygun formatta gösterir/döner.

EJB

Yazıda farklı teknolojiler kullanan farklı sunucularından bahsettim ancak uygulama sunucularından bahsedilen bir yazıda kısaca da olsa EJB’ye değinmek gereklidir. Enterprise Java Beans veya yeni adıyla Jakarta Enterprise Beans, sunucu tarafında çalışan ve uygulamaların iş mantıklarını standart ve modüler bir şekilde çalıştırmalarını sağlayan bir yapıdır. Çalışan iş mantığının ihtiyaç duyacağı transaction yönetimi, güvenlik, thread yönetimi gibi gereksinimleri karşılayarak yazılım geliştirmeyi ve yönetimini kolaylaştırmayı hedefler. Bu yapıyı destekleyen uygulama sunucularındaki iş mantığı EJB container’lar içinde çalıştırılır.

İlk olarak IBM tarafından geliştirilen ve sonrasında Sun Microsystems tarafından standartları yayınlanan EJB artık eskiyen bir teknolojidir ve pek çok projede EJB yerine Spring altyapısı kullanılmaktadır. Aslında bu 2 yapıyı direkt olarak birbiriyle kıyaslamak da doğru değildir. EJB yapısı bir spesifikasyondur (bir işi yapmak için uygulanacak olan yöntem ve standartlar), yani farklı uygulama sunucuları bu spesifikasyona göre EJB container’larını implement etmiştir. Spring ise tam olarak bir yazılım framework’üdür.

Çoğu zaman gerçek bir uygulama sunucusu ile web container arasındaki fark “EJB destekliyor mu?” sorusu ile anlaşılırdı. Spring’in yaygınlaşması ile bu 2 sunucu tipi arasındaki fark eskisi kadar keskin değildir.

Özet

Günümüz bilgi teknolojileri dünyasında, özellikle kurumsal uygulamaları çalıştırmak için, uygulama sunucuları vazgeçilmez durumdadır. İstemcilere dinamik içerik sunulması gereken uygulamalarda sunucuda bulunan iç mekanizmaları kullanarak hızlı ve verimli çözüm sağlarlar. Thread ve bağlantı yönetimi, güvenlik, yük dağılımı ve benzeri yapılar sayesinde uygulama geliştiricilere uygulamalarını çalıştırabilecekleri hazır bir ortam sunarlar ve yazılıma odaklanılmasını sağlayarak verimliliği artırırlar.

Bir sonraki yazımızda görüşmek üzere…

Referanslar

https://en.wikipedia.org/wiki/Nginx

https://en.wikipedia.org/wiki/Apache_Tomcat

https://www.ibm.com/docs/no/ims/15.2.0?topic=specification-configuring-thread-pool-in-websphere-application-server

https://ibertronica.es/blog/en/news-en/what-are-application-servers-and-why-do-you-need-them/

https://www.progress.com/blogs/application-servers--what-they-are-and-how-they-work

https://contabo.com/blog/what-is-an-application-server/

https://en.wikipedia.org/wiki/Thread_pool

--

--