Bir mobil uygulamayı beslemek veya platform bağımsız web servisler sunmak istiyorsunuz ve benim gibi gerekmese dahi en düşük kaynakla en yüksek performansı elde etme (early optimization) konusunda takıntılısınız. Nasıl bir tech-stack (teknoloji yığını) kullanmalıyım diye araştırırken bu yazıya denk geldiniz. Aynı araştırmaları ben de yaptım. Siz bu yazıyı okurken hale aynı fikirde olur muyum bilmiyorum ama benim vardığım sonuçlar şöyle
Hangi Dil ve Framework
Bir API projesi için programlama dili tercihim PHP veya Python olur. Birinci tercihim PHP ve bunun tek sebebi PHP’ye daha hakim olup, Python’la sadece CLI seviyesinde uygulamalarla haşır neşir olmam.
RESTful API için tercih edeceğim PHP framework’ü ise kesinlikle PhalconPHP olacaktır . “PhalconPHP Tartışmasız en hızlı PHP framework’ü” başlıklı yazımda Phalcon PHP’yi öne çıkaran özellikleriden bahsetmiştim.
Özetle;
PhalconPHP object oriented (nesne tabanlı) class’lar (sınıf) ile MVC mimarisi kurgusunda çalışan bir PHP FrameWork’ü. PhalconPHP’yi en hızlı yapan özelliği ise C ile derlenmiş ve PHP eklentisi olarak çalışan bir framework olması.Her ne kadar PHP 8.0 sonrasında bu özelliğini kaybedip diğer frameworklere benzer bir yapıya kavuşacak olsa da Phalcon ekibi performansın birinci öncelik olacağını vurguluyor.
Full-Stack ve Micro proje tipleri
Genel olarak PHP Frameworkleri Full-Stack (kapsamlı) ve Micro (minik) olarak ikiye ayrılıyor.
Full-Stack framework’ler daha fazla fonksiyonellik sağladığı için büyük projeler için daha iyi bir çözüm ama daha kompleks kodlar ve yüksek kaynak kullanımına neden oluyorlar.
Micro frameworkler ise asgari düzeyde fonksiyonelliği sağlayan ama büyük projelerde ekstradan çok fazla yama yapmanızı gerektirecek frameworkler. Öte yandan küçük yapıları sayesinde Full-stack framework’lere göre çok performanslı çalışıyorlar.
Hangi framework olduğundan bağımsız olarak RESTful API için en uygun framework tipi micro frameworkler.
Öte yandan Phalcon hem full-stack hem de micro proje desteği ile geliyor, micro framework olarak hız avantajı sağlarken, full-stack özelliklerini micro’ya entegre etmek de son derece kolay.
Veri Tabanı
Aslında proje ihtiyaçlarını bilmeden bir veri tabanı tavsiyesi yapmak doğru değil. Fakat ben relational (İlişkisel) bir veri tabanı ihtiyacı olduğunda MySql/MariaDB’ye meylediyorum. Sistemi “scale” etmek (genişletmek) gerektiğinde MySQL tabanlı Percona XtraDB gibi cluster tabanlı bir çözüme sorunsuzca geçebilecek olmak da iç rahatlatıcı.
NoSQL bir çözüme ihtiyacınız varsa benim tecrübem MongoDB veya Cassandra’yı kurmak ile sınırlı, o konuda ahkam kesmesem daha iyi olur. 🙂 Redis’e sonraki bölümde değineceğim, keza daha farklı bir kulvarda olduğunu düşünüyorum. (Aslında NodeJS öğrenmek için MongoDb’yi biraz kurcalamıştım ama çok yıllar önceydi)
Redis, OpCache, APC vb. caching çözümleri
Ben Session management (oturum yönetimi) ve cache için projeye Redis’i dahil ederim. PHP kullanacaksanız, cache için APC ve Redis’i birlikte kullanabilirsiniz. Symfony paketindeki Cache yöneticisi ile birlikte harika bir üçlü oluyorlar.
Sıra Yönetimi
RabbitMQ nedir başlıklı yazımda Queue Management (Sıra Yönetimi) nedir ayrıntılı açıklamıştım. Ayrıntılı bilgi için okumanızı öneririm.
Yine projenizin ihtiyaçlarına göre değişmekle birlikte (Günümüzde mail veya push notification göndermeyen proje kaldı mı?) Queue için RabbitMQ ve PHPAmqLib kütüphanesini birlikte kullanabilirsiniz.
Hangi Formatta Yanıt Döndüreceğiz?
Altyapımızı çok güzel kurduk ama hangi formatta çıktı vereceğiz. “Kafama göre bir standart belirledim, kullanacak olan bunu öğrensin”, “Mobil uygulama ekibi takılırsa gelsin bana sorsun” mu diyeceksiniz?
Arkada veri tabanlarına bağlandık, bir sürü kod çalıştırdık, sıralara işler gönderdik vs. vs. ama geri döndüreceğimiz cevap ne olacak? XML’mi kullanacağız, JSON’mı kulanacağız, CSV’mi döndüreceğiz? Bunlar için de kullandığımız etiketlerin bir mantığı olacak mı? Kısacası bu işin standartı ne olacak?
Cevap JSON API. Adından da belli olduğu gibi API’lerle JSON formatında çıktıları düzenleyen bir standart veya tarif. https://jsonapi.org/ sitesinden standartın dokümantasyonuna ulaşabilirsiniz. Topluluk tarafından PHP de dahil bir çok dil için sunucu ve istemci kütüphanelerini yazılmış. Bu kütüphanelerle basit bir array veya karmaşık bir modelinizi JSON API’ye uygun bir çıktı haline getirebilir (Örn. Backend’ciler için) veya JSON API formatındaki bir çıktıyı daha rahat kullanabilmek için Obje veya Array haline dönüştürebilirsiniz. (Örn. İstemci/Mobilciler için)
Geliştirmeyi Hangi Platformda Yaparsın?
Ben olsam NGINX/PHP, Redis, RabbitMQ ve MariaDB sunucularını Docker üzerinde kurar, başlangıçta production’a (canlı sunucuya) docker ile geçer, işler büyümeye başladığında bütün bunları Kubernetes Cluster’ına taşımak için çalışmaya başlardım.
Sonuç
Bu yazıda genel olarak standart bir API projesi için tercih ettiğim bileşenleri sıraladım. Özetlersek;
- Programlama dili olarak PHP veya Python
- Veri tabanı MySql
- Oturum Yönetimi ve Cache için Redis, APC ve Symfony Cache Bileşeni
- Sıra Yönetimi için RabbitMQ
- Çıktı formatı olarak JSON API
Çözümler ihtiyaçlara göre olacağı sizin projenizde çok daha kompleks yapılar olabilir. Fikir alışverişi yapmak isterseniz yorum yazabilir veya sosyal medyadan ulaşabilirsiniz.
Bu Yazıda Yapılan Değişiklikler
- 11.05.2022: Yazı özeti düzenlendi.