HTTP Multipart Batched Request ile daha optimize API’lere yelken açın

Mustafa İleri
2 min readDec 21, 2016

--

API’ ler yapıları gereği ihtiyaç duyulan bazı özellikler karşısında yoğun istek alabiliyorlar. Veya farklı “endpoint” ler geliştirerek çözmeye çalışıyoruz bu tip durumları.

Örnek vermek gerekir ise;
Bir admin panel üzerinde çalışıyorsunuz ve bir “dashboard” arayüzü yazacaksınız. Aslında ihtiyacınız olan şey bir API üzerinden siparişler, üyeler, ürünler, yorumlar “endpoint” lerine bağlanarak veri çekmek ve bunu göstermek.

Peki bunu nasıl yapıyoruz?

1. Yöntem: Her bir endpoint’e ayrı ayrı istek atıyoruz. Cevapları döndüğünde toplayıp bunları kullanıyoruz. Yukarıdaki senaryo için 4 tane “endpoint” için 4 istek yapıyoruz. Ayrıca bu istekleri “async” yapmıyorsak bütün istekler başlamak için önce yapılan isteğin bitmesini bekleyecek ve bu da isteğin süresini çok fazla uzatacak.
Sanırım en kötü implementasyon bu olurdu.

2. Yöntem: Bir adım iyileştirerek bu 4 istek için özel bir “endpoint” oluşturalım. Bu biraz daha iyi fakat sanki biraz “anti-pattern”. Çünkü böyle yaparsak API’ nin standardını bozuyor olabiliriz. Ayrıca geliştirme maliyeti var. Yeni bir özellik istendiğinde bunun eklenip “endpoint” in döndüğü cevap değişiyor. Ek olarak her özel istek için yeni endpoint’ler oluşturmak ne kadar mantıklı?

3. Yöntem: “HTTP Multipart Batched Request”

Sedat Sevgili’nin tavsiyesi ile “HTTP Multipart Batched Request” diye birşeyin varlığından haberim oldu ve ihtiyaçlar dahilinde bunu implemente etmeye başladık.

Şuradan da anlaşılacağı gibi; birbirinden bağımsız HTTP isteklerinin tek paket olarak gönderilmesini sağlayan metod diyebiliriz.

Temel fikir şu:
Gönderilen “batch” isteğinin “header” bilgisinde bu isteğin bir “multipart/batch” isteği olduğu belirtiliyor.

Ayrıca header bilgisinde “boundary” gönderiliyor. Çünkü isteğin içeriğinde yer alan istekleri ayırabilmek için “boundary” kullanılıyor.

İsteğin içeriğinde ise pakette yer alacak bütün isteklerin “raw message” hali bulunuyor. “boundary” ile ayrılmış olarak bütün istekler isteğin içeriğinde gönderiliyor.

Örnek bir multipart/batch isteği:

Bu istek sonucunda dönen şey ise benzer bir şekilde gönderilen ana isteğin cevabının içinde gönderilen diğer istekler yine “boundary” ler ile ayrıştırılmış olarak size dönüyor.

Örnek bir multipart/batch cevabı:

İstemci tarafından gönderilen isteğin nasıl ve ne şekilde yorumlanacağı tamamen sizin tercihinize kalmış. Bizim Ideasoft’ta yaptığımız implementasyon kullanmış olduğumuz Symfony framework üzerinde “sub request” seviyesinde “batch” isteklerini karşılamak oldu. Böylece isteklerin tamamını hiç sunucu seviyesine gitmeden direkt olarak “kernel” seviyesinde karşılamış olduk.

Farklı diller için farklı kütüphaneler mevcut iken, maalesef php ve symfony için düzgün bir client veya server kütüphanesi bulamadım. Bunları birer kütüphane olarak yazdım ve “composer” paketi olarak gönderdim.

Eğer kullanmak isteyen olursa:

Client için: https://github.com/IdeasoftLabs/http-batch-client
Symfony server için: https://github.com/IdeasoftLabs/http-batch-bundle

--

--

Mustafa İleri
Mustafa İleri

Written by Mustafa İleri

Tech Lead / Architect, Data Engineer, loves #python #symfony #django

Responses (2)