DEV Community

yqqwe
yqqwe

Posted on

Telegram Medya Dağıtımını Çözümlemek: MTProto ve Async I/O ile Yüksek Performanslı Bir Motor İnşa Etmek

Giriş

Bir yazılım geliştiricisi olarak, küresel ölçekteki platformların devasa multimedya verilerini nasıl yönettiğini ve dağıttığını anlamak her zaman büyüleyicidir. Telegram, sadece bir mesajlaşma uygulaması değildir; mühendislik perspektifinden bakıldığında, MTProto adı verilen özel bir şifreleme protokolü üzerine inşa edilmiş devasa bir dağıtık nesne depolama (distributed object storage) sistemidir.
Ancak, web tabanlı arşivleme araçları geliştirenler veya kaynakları platformlar arası (cross-platform) çıkarmak isteyenler için Telegram'ın kapalı ekosistemi (özellikle ikili protokolü ve katı oturum yönetimi) büyük bir engel teşkil eder. Bu boşluğu doldurmak amacıyla Telegram Video İndirici projesini geliştirdim.
Bu yazıda, teknik "kara kutunun" içine gireceğiz: MTProto etkileşimlerinin tersine mühendisliğinden, parçalı indirme algoritmalarının optimizasyonuna ve hız sınırlarını aşarken orijinal dosya bütünlüğünü korumak için sunucu tarafı akış (streaming) kullanımına kadar olan süreçleri inceleyeceğiz.

1. Protokolün Arkasındaki Mantık: MTProto'yu Anlamak

HTTP/HTTPS tabanlı tipik web kaynak dağıtımının aksine, Telegram'ın kalbi MTProto protokolüdür. Bir kullanıcı bir videoda "indir"e tıkladığında, istemci basitçe bir URL'ye GET isteği atmaz. Bunun yerine, bir dizi karmaşık RPC (Uzaktan Yordam Çağrısı) isteği başlatır.
1.1 Dosya Parçalama (Sharding) ve Veri Merkezleri (DC)
Telegram'ın temel mimarisinde, büyük dosyalar "chunk" adı verilen sabit boyutlu bloklara bölünür. Her dosya benzersiz bir access_hash ile ilişkilendirilir ve belirli bir Veri Merkezinde (DC) saklanır.
• DC Eşleştirme: Videolar, dünya çapında dağılmış DC1 ile DC5 arasındaki merkezlerde saklanabilir.
• Segmentli Veri Çekme: İstemci, dosyanın toplam boyutuna göre veri bloklarını talep etmek için offset ve limit değerlerini hesaplamalıdır.
Mühendislik Zorluğu: Yüksek performanslı bir indirme motoru sadece Telegram Bot API'sine güvenemez. Bot API, dosya boyutu (2GB) üzerinde katı sınırlara ve ciddi hız kısıtlamalarına sahiptir. Motorumuz, doğrudan Telegram'ın üretim DC ortamıyla iletişim kurarak bir UserSession simüle eder ve API darboğazını ortadan kaldırır.

2. Tersine Mühendislik: Web Yollarını Medya ID'lerine Dönüştürme

Çoğu kullanıcı, bir videoyu sadece bir Telegram kanalı veya grup bağlantısı kullanarak indirmek ister. Bu, herkese açık bir web önizlemesinden dahili bir Medya ID'sine çeviri katmanı gerektirir.
2.1 Meta Veri Çıkarma
Bir kullanıcı t.me/channel/123 gibi bir bağlantı girdiğinde, arka uç (backend) önce sayfanın OpenGraph etiketlerini taramak için hafif HTTP istemcileri kullanır. Ancak, web önizlemeleri genellikle yalnızca düşük çözünürlüklü akışlar veya küçük resimler sağlar. 1080p ve hatta 4K orijinal videoyu çekmek için bir eşleştirme algoritması uyguladık:

  1. Peer Tanımlama: Kanal tanımlayıcısının çözülmesi.
  2. MessageID Adresleme: Mesajın tam konumunun belirlenmesi.
  3. Medya Nesnesi Çıkarma: Dosya imzasını, boyutunu ve MIME türünü içeren document nesnesinin alınması.

3. Arka Uç Mimarisi: Async I/O ile Yüksek Eşzamanlılık

Küresel indirme isteklerini karşılamak için Telegram İndirici arka ucu, geleneksel bloklamalı (blocking) istek modelini tamamen terk ederek tam bir Python Asyncio + Telethon (Özelleştirilmiş) + Redis yığını kullanır.
3.1 Asenkron Segment Hızlandırma
Geleneksel sıralı indirmeler, ciddi I/O boşta kalma sürelerine neden olur. Bunu aşmak için bir Paralel Kayan Pencere Algoritması geliştirdik:
• Çoklu Bağlantı Paralelliği: Aynı video dosyası için DC'lere birden fazla bağlantı açıyoruz.
• Sırasız İstek, Sıralı Birleştirme: Eşzamanlı olarak 1-5 arasındaki parçaları talep ediyoruz ve bunları arabellekte (buffer) sırayla yeniden birleştiriyoruz.
• Akışlı Yazma (Streaming Write-out): En kritik nokta, videonun tamamını RAM'de saklamıyoruz. StreamingResponse kullanarak, Telegram DC'den gelen verileri HTTP protokolü üzerinden anında son kullanıcıya iletiyoruz.
Teknik Metrik: Bu mimari, sunucu bellek yükünü %90'dan fazla azaltır ve İlk Bayt Süresini (TTFB) önemli ölçüde düşürür.

4. Telegram Hız Sınırlarını (Flood Wait) Aşmak

Telegram, kısa aralıklarla gelen büyük trafik isteklerine karşı son derece hassastır ve FloodWaitError hatasını tetikler.
4.1 Akıllı Zamanlama ve Yük Dengeleme
Hizmet sürekliliğini sağlamak için çeşitli stratejiler uyguluyoruz:
• Çoklu Hesap Havuzu (Account Pooling): Dağıtık oturum depolama yoluyla istekleri birden fazla yük dengeleme düğümüne yayıyoruz.
• Üssel Geri Çekilme (Exponential Backoff): Sistem belirli bir DC üzerinde yüksek baskı algıladığında, otomatik olarak bekleme modundaki bir düğüme geçer ve mikro saniye düzeyinde gecikmeli yeniden denemeler yürütür.
• Redis ile Meta Veri Önbelleğe Alma: Popüler kaynakların tekrarlanan indirmeleri için sistem, dosya özelliklerini doğrudan önbellekten okuyarak Telegram DC'leri ile gereksiz etkileşimi azaltır.

5. Sunucu Tarafı İşleme: FFmpeg ile Kayıpsız Muxing

Bazı Telegram videoları ayrı ses ve video akışları olarak mevcuttur veya web dostu olmayan kapsayıcılar (containers) kullanır.
5.1 Gerçek Zamanlı FFmpeg Boru Hattı (Pipeline)
İndirilen veri akışını gerçek zamanlı olarak "pipe" aracılığıyla FFmpeg'e aktarıyoruz:
• Kayıpsız Muxing (Lossless): Video kodlaması (örn. H.264/H.265) modern standartlara uygun olduğu sürece sadece -c copy işlemi yapıyoruz. Bu, pikselleri yeniden hesaplamadan sadece kapsayıcıyı (örn. .mkv'den .mp4'e) değiştirdiğimiz anlamına gelir.
• Milisaniyelik Dönüşüm: Bu işlem CPU dostudur ve neredeyse anında tamamlanır, böylece kullanıcılar her cihazda oynatılabilir bir MP4 dosyasına anında sahip olur.

6. Ön Uç Optimizasyonu: Önce Fayda (Utility-First) Felsefesi

Ön uç (front-end) geliştirme "aşırı hız" ilkesini takip eder:
• Vanilla JS: Sayfanın zayıf ağ koşullarında bile anında yüklenmesini sağlamak için ağır frameworklerden kaçınıyoruz.
• PWA Desteği: Site, PWA spesifikasyonlarını destekleyerek kullanıcıların siteyi masaüstlerine bir yerel uygulama gibi "yüklemelerine" olanak tanır.
• Güvenlik: Tüm ayrıştırma mantığı sunucu tarafında kapsüllenmiştir; kullanıcıların riskli tarayıcı uzantıları yüklemesine gerek yoktur.

7. Sonuç ve Proje Vizyonu

Yüksek performanslı bir Telegram Video İndirici inşa etmek sadece basit bir veri çekme görevi değildir; modern protokolleri, ağ I/O yönetimini ve kaynak ölçeklendirmeyi anlama egzersizidir. MTProto etkileşimlerini optimize ederek ve asenkron arka uç mimarisini kullanarak neredeyse anlık 4K kaynak çıkarma başarısına ulaştık.
Eğer Telegram medya kaynaklarını arşivlemek için temiz, reklamsız ve teknik olarak sağlam bir yol arayan bir geliştiriciyseniz, aracımızı denemekten çekinmeyin.
👉 Proje Adresi: Telegram Video İndirici (Türkçe Sürüm)
Teknoloji Yığını Özeti:
• Backend: Python / Django / Redis / FFmpeg
• Çekirdek: Özelleştirilmiş MTProto Uygulaması
• Mimari: Asyncio / Slotted Eşzamanlı Veri Çekme
• Frontend: HTML5 / Tailwind CSS / Vanilla JS
• Altyapı: Cloudflare / Nginx / Docker
MTProto dosya dağıtım mantığı veya FFmpeg akış işleme hakkında sorularınız mı var? Yorumlarda tartışalım!

WebDev #Telegram #Python #FFmpeg #OpenSource #Programming #VideoStreaming #DevTools #TurkishDevelopers

Top comments (0)