İçeriğe geç
İndir
Tüm yazılar
Rehberler

Moove'un Performansını %59 Nasıl İyileştirdik

Moove kullanıcılarının çoğu sunucularımızdan çok uzakta. Tek bir sunucuyu taşımadan ilk yanıt süresini %59 nasıl kısalttık ve bunu zorlaştıran şey neydi.
6 Kas 20269 dk okuma

En yavaş bağımlılığımız mesafeydi

Moove app uygulamasını açan kişilerin çoğu Nijerya ve Endonezya'daki mobil ağlarda, kendilerine yanıt veren sunuculardan binlerce kilometre uzaktadır. Bu ay isteklerinin bize ulaşma biçimini değiştirdik ve ilk bayta kadar geçen süre (TTFB), yani bir telefonun istek göndermesi ile yanıtın ilk parçasının gelmesi arasında geçen süre, 0,74 saniyeden 0,31 saniyeye düşerek %59 azaldı. Bunun için tek bir sunucuyu bile taşımadık.

Bu yazıda mesafenin bize beklediğimizden neden daha pahalıya mal olduğunu, neyi değiştirdiğimizi, değişikliğin kendisinden daha zor çıkan kısmı ve aynı işi yapmak üzere olan başka bir ekibe neler söyleyeceğimizi anlatıyoruz.

Tek uzun yolculuk neden üçe çıkıyor

Mühendisler bir şeyi göndermek ile onun ulaşması arasındaki gecikmeye gecikme süresi (latency), bir mesajın sunucuya ulaşıp yanıtın geri dönmesi için geçen zamana ise gidiş-dönüş süresi (RTT) der. Lagos'tan sunucularımıza RTT 200 ile 300 milisaniye arasındadır. Tek başına bu katlanılabilir bir süredir. Sorun, bir isteğin nadiren tek başına yol almasıdır.

Bir telefon güvenli bir bağlantı üzerinden herhangi bir şey isteyebilmeden önce, bağlantıyı kuran kısa mesajlaşmalar olan iki el sıkışmayı (handshake) tamamlamak zorundadır. TCP el sıkışması bağlantıyı açar, ardından TLS el sıkışması bağlantıyı gizli tutan şifreleme anahtarlarında anlaşır. Her biri tam bir gidiş-dönüşe mal olur. İsteğin kendisi ancak bundan sonra gönderilir ve bu üçüncü yolculuktur. Yolculuk başına 250 milisaniyeyle, bir kullanıcı sunucularımız henüz hiçbir iş yapmadan yaklaşık dörtte üç saniye bekler.

Mobil ağlarda bu bedel umduğunuzdan çok daha sık ödenir. Telefonlar baz istasyonları arasında geçiş yapar, radyolar pil tasarrufu için uykuya geçer, uygulamalar arka plana atılır. Bu olayların her biri bağlantıyı koparabilir ve bir sonraki istek soğuk bağlantıdan (cold connection), yani henüz hiçbir el sıkışmanın yapılmadığı bir bağlantıdan başlamak ve kurulum bedelini baştan ödemek zorunda kalır. Önceden açılmış ve güvenli hale getirilmiş bir sıcak bağlantı (warm connection) ise doğrudan isteğe geçer.

Lagos'u sunucularımıza yaklaştıramazdık. Ama kurulumu Lagos'a yaklaştırabilirdik.

Sunucuları değil, el sıkışmayı taşımak

İçerik dağıtım ağı (CDN) genellikle bir önbellek olarak anlatılır: dosyaların kopyalarını yakından sunulabilmeleri için dünyanın dört bir yanında tutan bir dizi konum. Biz onu farklı bir amaçla kullandık. Uygulamanın yaptığı her şey için konuştuğu arayüz olan API için önbellek tamamen kapalıdır. Her istek yine de kaynak sunucuya (origin), yani CDN'in arkasındaki sunucular için kullandığı ada gider.

Değişen, bağlantının nereden başladığıdır. Bir telefon artık bağlantısını en yakın uç konuma (edge location) açar. Bu konuma varlık noktası (PoP) de denir: CDN'in dünyanın dört bir yanındaki sitelerinden biri ve çoğu zaman yüzlerce değil, onlarca milisaniye uzaklıkta. Uç konum TLS sonlandırmasını (TLS termination) yapar, yani telefondan gelen güvenli bağlantı orada biter. Ardından kaynak sunucumuza açık tutulan sıcak bağlantılardan oluşan bir havuzu yeniden kullanır. Bu bağlantılar, istekler arasında bir bağlantıyı kapatmak yerine açık bırakan bir ayar olan keep-alive ile açık tutulur. Pahalı iki kurulum yolculuğu kısa mesafede gerçekleşir ve okyanusu yalnızca isteğin kendisi, zaten sıcak olan bir bağlantı üzerinden geçer.

Üç uzun yolculuk, bir uzun ve iki kısa yolculuğa dönüşür. Bütün fikir bu.

Geri kalanı bilerek sıkıcı tuttuk:

  • İstemciler hiçbir şey fark etmedi. Uygulama ve web sitesi aynı adreslerini korudu; dolayısıyla uygulama sürümü gerekmedi ve kimsenin bir şeyi güncellemesine gerek kalmadı.
  • Hata davranışı aynı kaldı. Zaman aşımı süreleri öncekilerle aynı, yani daha önce başarısız olan her şey yine aynı şekilde başarısız olur. Yeni hata türleri istemedik.
  • Boşta kalan bağlantıları önce uç konum kapatır. Her bağlantının bir boşta kalma zaman aşımı (idle timeout) vardır: kullanılmadan ne kadar bekleyebileceği, ardından kapatılması. Sunucularımız sessiz bir bağlantıyı kapatırken uç konum onu hâlâ açık sanırsa, bir sonraki istek başarısız olur. Uç konumun zaman aşımını daha kısa ayarlamak, vazgeçen tarafın her zaman uç konum olmasını ve onun yeni bir bağlantı açmasını sağlar.
  • Telefonlar için daha yeni protokoller. Telefonlar, web'in istek protokolünün en yeni sürümü olan HTTP/3 ile bağlanabilir. HTTP/3, iki el sıkışmayı tek bir gidiş-dönüşte birleştiren ve mobil ağlarda yaygın olan paket kaybıyla daha iyi başa çıkan QUIC üzerinde çalışır.
  • Hiçbir bölge dışarıda bırakılmadı. Bir uç ağın daha ucuz katmanları, kullanıcılarımızın yaşadığı dünya bölgelerindeki konumları çoğu zaman atlar; biz de tam kapsamı seçtik.

Ne ölçtük

Lagos kadar sunucularımızdan uzak olan Sydney'den ölçüm yaptık ve eski yolu yenisiyle karşılaştırdık. Her biri için, mobil ağlarda en çok önem taşıyan durum olan beş yeni soğuk bağlantı açtık ve medyanı aldık. Medyan p50 olarak da yazılır: isteklerin yarısının geçtiği, yarısının geçemediği ortadaki sonuç. Aynı proje, tam boyutta gönderilen web sitemizin betikleri için sıkıştırmayı (compression) da açtı. Sıkıştırma bir dosyayı gönderilmeden önce küçültür ve tarayıcı varışta onu yeniden açar; biz web için geliştirilmiş bir sıkıştırma biçimi olan Brotli'yi kullandık.

Ne ölçtükÖnceSonraİyileşme
TCP ve TLS el sıkışmaları tamam (p50)490 ms59 ms%88 daha hızlı
İlk bayta kadar geçen süre (p50)743 ms307 ms%59 daha hızlı
Ana sayfa betik yükü1,76 MB560 KB%68 daha küçük

%59'luk iyileşme, ilk bayta kadar geçen süreden gelir. Eskiden kurulması yarım saniye süren bir bağlantı artık saniyenin onda birinden kısa sürede hazır ve web sitemizin ilk ziyareti artık, birçok kişinin her megabayt için para ödediği bağlantılarda üçte iki daha az veri indiriyor.

Bu rakamlar küresel bir kıyaslama değil, tek bir şehirden geliyor. Yine de hesap Lagos ve Cakarta için de geçerli ve kullanıcılarımız oradalar.

Zor kısım, arayanın kim olduğunu bilmekti

Sunucularınızın önüne bir şey koymak kolaydır. Çabanın büyük kısmı, korumalarınızın onun arkasında çalışmaya devam etmesini sağlamaya gitti.

Çoğu ödeme platformu gibi Moove da, herhangi bir arayanın belirli bir sürede yapabileceği istek sayısına konan bir sınır olan hız sınırlaması (rate limiting) kullanır ve bu sınırlar, internette bir cihazı tanımlayan sayı olan arayanın IP adresine göre tutulur. Bir uç ağın arkasında her istek, kullanıcının değil bir uç konumun adresinden gelir. Başka hiçbir şey değişmeseydi, Lagos'taki herkes tek bir kotayı paylaşırdı ve yoğun bir öğleden sonra, hiçbir yanlış yapmamış insanları geri çevirmeye başlardı.

Çözüm iki fikre dayanıyor.

Tam olarak sahip olduğunuz katmanlara güvenin. CDN, bir tür ters proxy (reverse proxy) yani sizinkinin önünde duran ve istekleri ileten bir sunucudur. Her proxy, bir isteği aldığı adresi X-Forwarded-For adlı standart bir başlığa ekler; böylece gerçek arayan, bu listede belirli sayıda adım, yani sıçrama (hop) geridedir. Bu sayıyı yanlış bulmak her iki yönde de bir hatadır. Çok az katman sayarsanız her kullanıcı kendi uç konumu gibi görünür. Çok fazla sayarsanız arayanın kendi yazdığı bir girdiye güvenmeye başlarsınız. Bu yüzden sayıyı kodun değil altyapının bir özelliği haline getirdik. Ağ değiştiği anda o da değişir ve hizmetimiz, değer anlamsızsa tahmin yürütmek yerine başlamayı reddeder.

Arayanın kimliğini uç konum doğrulasın ve yalnızca uç konuma inanın. Uç konum artık her isteğe gerçek arayanın adresini yazıyor ve arayanın bunun yerine gönderdiği her şeyin üzerine yazıyor. Korumalarımız bu değere yalnızca isteğin gerçekten uç konumumuzdan geçtiğini doğrulayabildiklerinde inanır. Daha önce ağ adresine göre tutulan her sınır, uç konum trafiği için artık gerçek arayana göre tutuluyor. Bu kuralları eskilerin yerine değil yanlarına ekledik; böylece devreye almadaki her değişiklik saf bir ekleme oldu ve herkes tek okumada inceleyebildi.

Yayına çıkmadan yakaladığımız bir hata

Moove Profiles, bir tüccarın kendi alan adında yaşayabilir. Bu alan adlarına gelen istekler, sitenin hangi profili göstereceğini bilmesi için tüccarın alan adı eklenmiş olarak web sitemizden geçiriliyordu.

Web sitesinin önündeki yeni uç konum, gelen isteklerden bu tür bilgileri ayıklar ve bu tamamen doğrudur, çünkü bir ziyaretçi bunu asla kendisi belirleyememelidir. Ancak bu, web sitesi uç konumun arkasına taşındığında her tüccar alan adının tüccarın profili yerine sessizce Moove ana sayfasını göstereceği anlamına da geliyordu.

Bunu incelemede yakaladık, tüccar alan adı yolunu önce kendi rotasına taşıdık ve altyapımızın, bu taşıma yapılmamış hiçbir yerde web sitesi değişikliğini uygulamayı reddetmesini sağladık. Eskiden yalnızca bir inceleyicinin kafasında yaşayan bir hata, artık derlemenin durdurduğu bir şey.

Genel ders şu: girdileri temizleyen bir katman eklediğinizde, temizlemek üzere olduğunuz girdilere bağımlı olan her şeyi arayın.

Nasıl devreye aldık

Ödeme altyapısında "yayına al ve bak" yapılmaz; bu yüzden önce hazırlık ortamını, sonra üretimi değiştirdik ve birkaç tercih geçişi olaysız tuttu. İnternetin, moove.xyz gibi bir adı sunucu adresine çeviren rehberi olan DNS kayıtlarımızın TTL (yaşam süresi) değerini düşürdük. TTL, internetin geri kalanının bu yanıtı ne kadar süre önbellekte tutabileceğidir ve biz onu bir saatten beş dakikaya indirdik. Bunu, hiçbir şey taşınmadan tam bir saat önce yaptık; böylece eski yanıt her yerde geçerliliğini yitirdi ve bir geri alma dakikalar içinde etkili olacaktı. Adres kayıtlarını yerinde değiştirilebilecek bir biçimde tuttuk, çünkü onları silip yeniden oluşturmak bir boşluk bırakırdı ve bir boşluk kesintidir. Riskli her adım kendi küçük değişikliğiydi ve onu geri almanın adımları sırayla yazılmıştı.

Başka bir ekibe ne söylerdik

Kullanıcılarınız sunucularınızdan uzaksa, hiçbir şeyi önbelleğe almasa bile bir uç ağ değerlidir. Geçişten önce:

  • Arayanın adresini okuyan her şeyi listeleyin: hız sınırları, izin listeleri, sahtekârlık sinyalleri, denetim kayıtları ve güvenlik kuralları. Siz değiştirmedikçe hepsi uç konumun adresini görür.
  • Güvenilen katman sayısını altyapınızın bir parçası yapın ve yanlış olduğunda başlamayı reddedin.
  • Gerçek arayanı uç konumun kaydetmesine izin verin ve bu kayda yalnızca uç konumunuzdan geldiğini doğrulayabildiğiniz trafikte güvenin.
  • Sunucularınızın trafiği yalnızca uç konum üzerinden kabul ettiğinden emin olun ve zorunlu kılmadan önce izleyin.
  • Sayfaları önbelleğe alıyorsanız, önbellek anahtarını (cache key), yani bir önbelleğin iki isteğin saklanan tek bir yanıtı paylaşıp paylaşamayacağına karar vermek için kullandığı istek ayrıntıları kümesini, yanıtın gerçekte bağlı olduğu her şeyden oluşturun. Sunucular bu ayrıntıları bir Vary başlığında listeler; bu yüzden hafızanıza güvenmek yerine onu okuyun.
  • Öncesinde ve sonrasında ölçüm yapın ve el sıkışma süresine ile ilk bayta kadar geçen süreye ayrı ayrı bakın; böylece bağlantı kurulumunu sunucularınızın çalışarak harcadığı zamandan ayırt edebilirsiniz.

İleriye bakış

Sayfalarımızın çoğu kişiselleştirilmiş olduğundan, web sitesinin uç önbelleği şimdilik çoğunlukla boşta duruyor. Bağlantı iyileştirmesi her sayfa için geçerli ve ayrı sayfalar, paylaşılmaları güvenli olduğunda artık önbelleğe almayı seçebiliyor. API yanıtlarını önbelleğe almak kendi tasarımını ve incelemesini gerektirir ve bakmak istediğimiz bir sonraki şey bu.

Para, bir okyanusu aşan ışığın hızıyla değil, ağın hızıyla hareket etmeli.

Moove üzerinde geliştirme yapıyorsanız Web3 ödeme API'leri ve SDK'larına giriş yazımızı ve Moove Developer Program yazısını okuyun.

moove.xyz mühendislik ekibi tarafından yazılmıştır.

moove.xyz Hakkında

moove.xyz, değerin izinsiz ve zahmetsiz hareketi için inşa edilmiş küresel bir Web3 fintech platformudur. İşletmeleri ve tüketicileri dünyanın her yerinde herhangi bir blok zincirinde herhangi bir kripto para birimini gönderme, alma, stake etme ve takas etme konusunda güçlendiriyoruz — hepsi tek bir platformda.

Çok zincirli cüzdan erişimi, kişiselleştirilmiş cüzdan tanıtıcıları, zincirler arası token takasları, gömülü zincirler arası işlemler ve merkezi olmayan sosyal finansal ağ dahil entegre ve kapsamlı kapsama sağlayan tam yığın kripto ödemeler ve merkeziyetsiz finans altyapısı oluşturmak ve yenilik yapmak için dünya genelinde ilk Web3 fintech şirketlerinden biriyiz. Temel ürünlerimiz arasında Moove Profile, Moove Send, Moove Receive, Moove Stake, Moove Swap, Moove Rewards, Moove Discover ve daha fazlası yer almaktadır.

Misyonumuz basit — sonraki 1 milyar Web3 kullanıcısı için izinsiz ve zahmetsiz finansal teknoloji yaratmak ve dağıtmak. Para ve değer hareketinin geleceğinin maliyetsiz, sınırsız, izinsiz, zahmetsiz ve herkes için inşa edilmiş olacağına temel inanıyoruz — ve bu geleceği gerçek kılmak için nihai Web3 fintech platformunu inşa ediyoruz.

Paranız. Hamleniz.

Okumaya devam edin.

Paranız sizin, karar sizin.

Moove uygulamasını indirmek için tarayın
App Store'dan indirinGoogle Play'den alın