Canlı yayının altındaki protokolü değiştirmek: Instagram Live’da Media over QUIC
Shipping Media Over QUIC at Meta Scale for Instagram Live Ingest
Instagram Live artık iOS ve Android’de canlı video yüklemesi (ingest) için açık standart Media over QUIC (MoQ) kullanıyor. İnternet yıllar içinde her biri kendi sorununa göre biçimlenmiş bir protokol yığını biriktirdi: yükleme için RTMP, oynatma için HLS ve DASH, gerçek zamanlı aramalar için WebRTC. Meta’da canlı yayın başlatıp aynı uygulamada sesli arama yapan biri üç ayrı protokol yığınına dokunuyor; her birinin kendi sunucu altyapısı, izlemesi ve uzmanlığı var. MoQ’un vaadi, yükleme, dağıtım ve oynatma için tek bir taşıma katmanı.
MoQ nasıl çalışır? IETF’te Meta, Google, Akamai, Cisco, Cloudflare ve akademinin katılımıyla geliştirilen bir standart. Temel soyutlama Track: yayıncıların ittiği, abonelerin bir relay (relay) ağı üzerinden aldığı adreslenebilir medya nesnesi akışı. Relay’ler nesneleri medya içeriğini çözümlemeden cache’e alıp iletiyor. Öne çıkan özellikler: QUIC sayesinde akışlar arası TCP tarzı head-of-line blocking yok; caching ve çoğaltma protokolün içinde; aynı Track’in iki abonesi aynı anda farklı gecikmelerde çalışabiliyor (etkileşimli katılımcı için yaklaşık 100 ms, arşiv için birkaç saniye); relay’ler tıkanıklıkta nesneleri metadata’ya göre düşürüp önceliklendirebiliyor; QUIC engellendiğinde standart bir TCP geri dönüşü var.
Geçiş nasıl yapıldı? Canlı yükleme yaklaşık on yıldır Meta’nın kendi QUIC tabanlı protokolü RUSH üzerindeydi. Yazının itirafı şu: canlı bir sistemde taşıma protokolünü değiştirmenin zorluğu protokolle pek ilgili değil. Üç kısıtlı probleme böldüler. İstemci: açık kaynak MoQ kütüphaneleri moxygen üzerine kurulu bir yayıncı; tek bir yapılandırma parametresi yayın başına MoQ ya da RUSH seçiyor. Arka ucu yeniden yazmak yerine uçta çeviri: MoQ bağlantıları özel uç noktalarda sonlanıyor ve bir çeviri katmanı MoQ çerçevelerini arka ucun zaten anladığı RUSH biçimine dönüştürüyor. Aşağı akışta hiçbir şey değişmiyor; çevirici geçici bir iskele. Sunucu taraflı yönlendirme: yayın URL’si üretilirken deney grubuna göre MoQ uç noktası seçiliyor; böylece yayılım uygulama sürümünün benimsenmesine bağlı değil ve deney dakikalar içinde büyütülüp küçültülebiliyor.
Operasyonel engeller. Taslak standart geliştirme sürerken değişti: belirli taslak sürümlerine sabitlendiler ve eski istemciler için uyumluluk katmanları tuttular. UDP/443 kurumsal ve operatör ağlarının azımsanmayacak bir bölümünde engelli: yayın başında TCP ve QUIC handshake’leri yarıştırılıyor, kazanan oturum boyunca kullanılıyor. QUIC şifrelemesi çerçeveleri kendi paket yakalamalarından da gizlediği için uca MoQ’u tanıyan izleme eklediler.
Sonuç: aylarca süren deneyin ardından MoQ yolu, kalite ve güvenilirlik göstergelerinde RUSH ile eşit çıktı. Bu aşamanın hedefi iyileşme değil eşitlikti: üretimdeki bir taşıma katmanını kimseyi rahatsız etmeden değiştirebildiklerini gösterdi ve sonraki adımlar için temiz bir taban verdi.
Öne çıkanlar
- Büyük bir geçişte ilk hedef iyileşme değil eşitliktir; eşitlik sonraki her adımın tabanıdır.
- Geçici bir çeviri katmanı, istemci ve arka uç değişikliklerini birbirinden ayırır.
- Yayılımı istemci sürümüne değil sunucu taraflı yönlendirmeye bağlamak, saniyeler içinde rollback’ı sağlar.
- Yeni protokol her ağda çalışmaz; geri dönüş yolu tasarımın parçası olmalı.
- Şifreli protokolde debugging için gözlemlenebilirliği uç noktaya kendin koymalısın.
Neden önemli?
Çalışan bir sistemin temel bileşenini değiştirmek, mühendisliğin en riskli işlerinden biri. Bu yazıdaki üçlü (bayrakla seçilebilir yeni yol, geçici çeviri katmanı, sunucu taraflı yayılım) protokolden bağımsız, her büyük geçişe uyan bir kalıp.
Pratikte
Bu kalıbı bir sonraki büyük değişikliğinde uygula; örneğin mesajlaşmayı polling’den WebSocket’e ya da bir kütüphaneyi diğerine taşırken. Bir: yeni yolu bir feature flag’in arkasına koy ve eski yolu silme. İki: yeni istemciyi eski backend’e bağlayan ince bir adapter yaz; iki tarafı aynı anda değiştirme. Üç: flag’i sunucuda tut ki uygulama güncellemesi beklemeden kapatabilesin. Dört: başarı ölçütünü baştan yaz: ‘hata oranı ve p95 gecikme eskisiyle aynı’. WebSocket için de aynı ders geçerli: bazı ağlar bağlantıyı keser, long polling’e geri dönüş yolunu baştan tasarla.
Sözlük
- Media over QUIC (MoQ)
- Canlı yayın ve gerçek zamanlı iletişim için QUIC üzerinde çalışan, IETF’te geliştirilen medya taşıma protokolü.
- ingest
- Yayıncının cihazından sunucuya giden canlı video akışı.
- head-of-line blocking
- Kaybolan tek bir paketin, arkasındaki ilgisiz verilerin de beklemesine yol açması.
- relay
- Medya nesnelerini içeriğini çözmeden cache’e alıp abonelere ileten ara sunucu.
- feature flag
- Bir özelliği kod dağıtmadan açıp kapatmayı sağlayan yapılandırma anahtarı.