Elixir ile yazılmış yeni bir BitTorrent tracker uygulaması
(github.com/Dahrkael)- ExTracker, Elixir tabanlı yeni bir BitTorrent tracker projesi
- Yüksek performans ve düşük bellek kullanımı temel alınarak tasarlanmış; pratikte neredeyse sıfır kurulumla hemen kullanılabiliyor
- Çeşitli BitTorrent protokolü (BEP) genişletme önerilerini destekleyerek esneklik ve uyumluluk sunuyor
- HTTPS desteği, disk yedekleme, operasyonel yönetim özellikleri gibi gerçek kullanım için gerekli başlıca işlevleri içeriyor
- Şu anda endüstriyel kullanım için henüz tamamlanmamış durumda, ancak bir test örneği gerçek ortamda çalışıyor
Genel bakış ve projenin önemi
ExTracker, Elixir ile geliştirilen yeni bir açık kaynak BitTorrent tracker projesi ve mevcut tracker'lara kıyasla şu avantajları sunuyor:
- Güncel Erlang/Elixir çalışma zamanı üzerinde, tüm çok çekirdekli kaynakları kullanan yüksek performanslı bir mimariye sahip
- Büyük ölçekli peer ortamlarında (yaklaşık 1 milyon peer başına 200MB RAM) düşük bellek kullanımı sağlıyor
- Karmaşık ön yapılandırma gerektirmeden anında çalışan bir sıfır kurulum deneyimi sunuyor
- Birden fazla BitTorrent Enhancement Proposal (BEP) desteğiyle güncel tracker standartlarıyla uyumluluğu koruyor
Mevcut tracker'lara göre hafif ve verimli olan proje, Elixir'in özgün eşzamanlılık ve dağıtık ortam desteğinden azami ölçüde yararlanarak benzer açık kaynak projelerden ayrışıyor
Başlıca özellikler (Features)
- Yüksek performans: Tüm CPU çekirdeklerini kullanır, bellek içi depolama kullanır
- Bellek optimizasyonu: 1 milyon peer başına yaklaşık 200MB RAM kullanır
- Sıfır kurulum: Hiçbir ek yapılandırma olmadan doğrudan çalıştırılabilir
Desteklenen BitTorrent Enhancement Proposals (BEP)
- BEP 0: BitTorrent protokolü spesifikasyonuna uyum
- BEP 15: UDP tracker protokolü desteği
- BEP 23: Sıkıştırılmış peer listesi döndürme
- BEP 7: IPv6 tracker genişletmesi
- BEP 24: Harici IP döndürme
- BEP 41: UDP tracker protokolü genişletmesi
- BEP 48: Scrape tracker genişletmesi (kısmi destek)
- BEP 52: BitTorrent protokolü v2
- Bazı işlevler (BEP 27, 21, 31 vb.) henüz uygulanmamış ya da planlama aşamasında
- BEP 8 (tracker peer obfuscation) desteklenmiyor
Diğer özellikler
- HTTPS bağlantı desteği
- Disk yedekleme (veri güvenliğini artırır)
- (Planlanıyor) Infohash beyaz liste/siyah liste yönetimi
- (Planlanıyor) Peer yönetimi: yetkiler, periyodik temizlik, çıkarma vb.
- (Planlanıyor) Metrik/gösterge yönetimi ve GeoIP kullanımı
- WebTorrent için destek planlanmıyor
Kullanıcı ve geliştirici önerileri Issue olarak kabul ediliyor
Çalıştırma yöntemleri
- Kaynak koddan doğrudan çalıştırma
- Erlang ve Elixir gerekir
- Depoyu klonladıktan sonra yapılandırıp çalıştırın
- Release yöntemi
- Resmî bir release yok, ancak doğrudan derleme ve dağıtım yöntemi destekleniyor
- Release dosyalarını kopyalayıp yapılandırdıktan sonra çalıştırın
- Docker
- Resmî container image kullanılabilir
docker-composeörnek dosyası sağlanıyor- Container içi yapılandırmada ortam değişkenlerinin kullanılması öneriliyor
Telif hakkı ve lisans
- Copyright (c) Dahrkael <dahrkael at outlook dot com>
- Apache License 2.0 kapsamında dağıtılır
- Lisans ayrıntıları için depodaki LICENSE dosyasına bakın
1 yorum
Hacker News görüşleri
OTP merkezli bir tasarım beklediğini, ancak gerçek kodun neredeyse prosedürel kaldığını ve ETS ya da Application gibi ETS tabanlı sistemlerle her seferinde doğrudan uğraşma yaklaşımının hayal kırıklığı yarattığını söylüyor
Yazar Elixir veya BEAM dillerinde servis tasarımını öğrenmek istiyorsa, James Edward Gray ile Bruce Tate’in yazdığı "Designing Elixir Systems with OTP" ve Lance Halvorsen’in "Functional Web Development with Elixir, OTP, and Phoenix" kitaplarını başvuru kaynağı olarak öneriyor
Torrent tracker’ın sonuçta özelleşmiş bir veritabanı olduğunu, bu yüzden veriyi olabildiğince hızlı işlemenin en önemli hedef olduğunu düşündüğünü belirtiyor
Yine de önerilen kitapları mutlaka okumayı planladığını ifade ediyor
C++ geliştiricilerini Go ve Elixir’ye çeken özel bir şey olduğunu düşündüğünü söylüyor
Kendisinin de buna dahil olduğunu belirtiyor
Performansa ilgi duyup C++ seven insanların, Go veya Elixir’nin çoklu iş parçacığı performansını sevdiğinden bahsediyor
Projeyi de harika bulduğunu ekliyor
Pattern matching’in çoğu dallanmayı ve kod karmaşıklığını azaltarak kodu çok daha temiz hale getirdiğini belirtiyor
"Let it crash" felsefesi sayesinde çoğu istisna durumunu görmezden gelse bile, gerçekten bir sorun çıkarsa etkisinin tek bir istemciyle sınırlı kalacağından emin olduğunu söylüyor
10 yılı aşkın süredir Elixir ile dağıtıma çıkmış uygulamalarda beklenmedik bir kesinti yaşamadığını belirtiyor
Bakım ve güncellemeler dışında her zaman %100 çalışma süresi gördüğünü vurguluyor
Müşterilere “Python ya da Go yerine Elixir ile yapılan servisler asla çökmez, üstüne bir de harika dashboard’lar sunar” diye anlattığını ve birçok kişinin bununla hemen ikna olduğunu söylüyor
Elixir gibi struct ve enum ile fonksiyon imzalarında pattern matching desteği sunan bir sistem dili olmasını istediğini ekliyor
Kendisinin de BT’yi öğrenmek amacıyla Typescript ile benzer bir şey yaptığını söylüyor
Daha sonra Rust ile yeniden yazarak Rust’ı da öğrendiğini belirtiyor
proje bağlantısı
Veritabanı olarak yalnızca redis kullandığını, karşı tarafın ise her şeyi bellekte tutmasının ilginç geldiğini söylüyor
Bu şekilde tasarlarken ne tür düşünceler, eğlenceli kararlar veya sorunlar yaşandığını merak ediyor
Bu arada redis tabanlı çözümünde, announce işlemi birkaç kez yapıldığında peer’ların her zaman rastgele karışmaması gibi bir sorun olduğunu ekliyor
Her peer verisinin ayrı süreçler tarafından eşzamanlı okunup yazılabildiğini, bu yüzden çekişme ve gecikmenin minimuma indiğini belirtiyor
Sıralı kalan tek kısmın yeni bir swarm ilk kez oluşturulduğunda yaşandığını ve bunun da sık olmadığı için sorun yaratmadığını söylüyor
Ne yazık ki tablodan rastgele satır seçmek için yerel destek olmadığını, bu yüzden şu anda tüm swarm’ı çekip rastgele bir alt küme seçtiğini belirtiyor
ilgili kod örneği
Bunun harika bir proje olduğunu düşünüyor
Geçmişte kendisinin de Elixir ile temel bir tracker yazdığını söylüyor
kod bağlantısı
Özellikle neden private tracker olarak tasarlandığını merak ediyor
Projenin yayımlanmasını kutluyor
opentracker ile karşılaştırıldığında nasıl davrandığı ve performansı hakkında daha fazla bilgi merak ediyor
Ama extracker’ın asıl gücünü CPU çekirdeği sayısı çift hanelere çıktığında gösterdiğini belirtiyor
Henüz düzgün bir benchmark yapmadığını da ekliyor
Çok iyi yapılmış bir proje olduğunu söylüyor
Kısa bir tavsiye olarak,
IO.putsyerine Logger’a geçmeyi ve OTel eklemeyi düşünmeyi öneriyorBuna katıldığını söylüyor
Yerleşik Logger ve Telemetry uygulamalarını kullanmanın fazlasıyla yeterli olduğu görüşünde
Daha sonra opentelemetry veya başka şeylerin de Telemetry hook’larına kolayca eklenebileceğini belirtiyor
Logger documentation
Telemetry documentation
Tercih ettiği otel sink’in ne olduğunu soruyor; yani metrikleri nereye göndermeyi tercih ettiğini
Elixir’yi gerçekten çok sevdiğini söylüyor
Şu anda Elixir ile harika bir notification engine geliştirdiğini belirtiyor
Elixir’nin gerçekten olağanüstü olduğunu söylüyor
Bunun private bir proje mi yoksa OSS mi olduğunu merak ediyor
Elixir ekosisteminde daha iyi bir notification engine’e ihtiyaç olduğunu ekliyor
Referans aldığı projeler olup olmadığını soruyor
Geliştirmenin ne kadar sürdüğünü merak ediyor
qbittorrent ile kıyaslandığında ne kadar işlevin çalıştığını soruyor
Başka bir projede kullanmak için bir tracker’a ihtiyaç duyduğu için başladığını, ama tracker geliştirmenin kendisinin daha eğlenceli hale geldiğini ve bu yüzden devam ettiğini söylüyor
Diğer tracker kodlarına baktığını, ancak çoğunun ya fazla karmaşık ya da fazla basit olduğu için iyi bir referans olmadığını belirtiyor
Şu ana kadar birkaç gece boyu kodlama seansı eşliğinde 3 aydır üzerinde çalıştığını söylüyor
qbittorrent gibi bir istemci olmadığını, ama ileride seedbox odaklı bir istemci projesi fikri olduğunu ekliyor
Tracker’ın torrent istemcisi olmadığını açıklıyor
Bizzat denediğini ama HTTPS’in düzgün çalışmaması gibi bir sorun yaşadığını söylüyor
Ayrıca konsolda
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused"
gibi uyarı mesajlarının sürekli çıktığını belirtiyor
Buna rağmen çalışıyor gibi göründüğünü ekliyor
HTTP istatistiklerini de görmek istediğini ama yalnızca UDP istatistiklerinin göründüğünü söylüyor
(Kendisinin UDP’yi devre dışı bıraktığını da not ediyor)
"paused" olayının BEP 21’in bir parçası olduğunu, istemcinin hâlâ tamamlanmamış olsa da artık indirme yapmadığını tracker’a bildirmek için kullanıldığını açıklıyor
Örneğin kullanıcının torrent içindeki dosyaların yalnızca bir kısmını istediği durumlarda işe yaradığını söylüyor
Projeye ait readme dosyasında BEP 21 desteği olmadığının belirtildiğini ekliyor
HTTP ile ilgili Telemetry’nin hâlâ ToDo listesinde olduğunu söylüyor
Web sunucusu olarak 3rd-party bir kütüphane kullandığı için uygun entegrasyon yöntemini hâlâ düşündüğünü belirtiyor
HTTPS kullanmak için
:https_keyfileayarına geçerli bir sertifika yolu verilmesi gerektiğini söylüyorŞimdilik HTTPS isteniyorsa tracker’ın önüne Caddy veya Nginx koymayı öneriyor
certbot entegrasyonunu da planladığını, ancak torrent peer’larının çoğu UDP kullandığı için bunun önceliğinin düşük olduğunu ekliyor
Gerçekten harika bir proje olduğunu söylüyor
Elixir’yi ana dili olarak kullanmayı düşünüp düşünmediğini soruyor
Elixir’nin başlıca seçeneklerinden biri olduğunu söylüyor
Kişisel olarak C++’a kıyasla onunla çalışmanın kesinlikle daha keyifli olacağına inandığını belirtiyor
Kendisinin olmasa da yaklaşık 9 yıl 2 aydır Elixir ile çalıştığını, ayrıca Rust ve Golang de bildiğini söylüyor
Şu anda birilerinin işe alım yapıp yapmadığını merak ediyor