Go'da Relay İnşa Ederken Neler Kırıldı: Zamanlama ve Sıralama Sorunları
Bir Go relay geliştirirken ortaya çıkan sorunlar, dil tasarımı değil zaman ve koordinasyon konularında yoğunlaşıyor. Ajanlar bağlantı kurup TCP, HTTP ve şifreli oturumları çoğullama yoluyla geri gönderiyor; yapı ağırlıklı goroutine, kanal, akış denetimi ve yeniden başlama sırasında hayatta kalması gereken işlemlerden oluşuyor.
Komit geçmişine bakıldığında en çok zaman harcayan hatalar şaşırtıcı derecede dilin kural dışına çıkaramayacağı türde değildi. Sabit bekleme süreleri testleri başlıca sorun kaynağı oldu, yaklaşık 80 komit flaky testleri andırıyor. Bir testin 1 saniye beklemesi, boş bir dizüstü bilgisayarda 1 saniye süren bir işlem için yeterli ama yüksek yükte 4 saniyeye çıkabiliyor. "Başlıklar gövdeden önce gelsin" kontrolü "başlıklar 1 saniye içinde, gövde 2 saniye sonra" şeklinde yazıldığında, yoğun bir relay bunu aşıyor ve test başarısız oluyor.
İkinci büyük kategori goroutine'ler arasındaki sıralama sorunuydu. Bir close frame, başka bir goroutine'de hala kuyrukta olan veriyi geçip 100 yanıttan 38'ini kesiyor. Burada yarış durumu (-race) açısından bir hata yok; her erişim senkronize ama sıra yanlış. Rust'ın ownership sistemi bu tür sıralama hatalarını doğrudan engellemez; sorun zaman ve mantık alanında.
Asıl ders şu: bir dil, test zamanlaması veya goroutine koordinasyon mantığını düzeltemez. İster Go ister Rust olsun, eşzamanlı sistemlerde bu tür hatalar tasarım ve dikkatlice düşünülmüş test stratejisinden geçer. Rust'ın bellek güvenliği değerli ama buradaki sorunlar için cevap değil.
0 yorum