Nouvelle implémentation de tracker BitTorrent écrite en Elixir
(github.com/Dahrkael)- ExTracker est un nouveau projet de tracker BitTorrent basé sur Elixir
- Il a été conçu autour d’une haute performance et d’une faible consommation mémoire, et peut être utilisé pratiquement sans configuration
- Il prend en charge plusieurs propositions d’extension du protocole BitTorrent (BEP), offrant diversité et compatibilité
- Il inclut des fonctions clés nécessaires en production, comme la prise en charge de HTTPS, la sauvegarde sur disque et des fonctions d’exploitation et d’administration
- À ce stade, il est encore inachevé pour un usage industriel, mais une instance de test fonctionne déjà en conditions réelles
Vue d’ensemble et importance du projet
ExTracker est un nouveau projet open source de tracker BitTorrent implémenté en Elixir, qui offre les avantages suivants par rapport aux trackers existants
- Basé sur le runtime Erlang/Elixir moderne, avec une architecture hautes performances capable d’exploiter tous les cœurs multicœurs
- Garantit une faible consommation mémoire dans des environnements à grande échelle (environ 200 MB de RAM par million de pairs)
- Propose un environnement sans configuration qui fonctionne immédiatement sans réglages préalables complexes
- Maintient la compatibilité avec les standards récents des trackers grâce à la prise en charge de plusieurs BitTorrent Enhancement Proposals (BEP)
Plus léger et plus efficace que les trackers existants, il se distingue des projets open source comparables en exploitant au maximum les capacités propres à Elixir en matière de concurrence et d’environnements distribués
Fonctionnalités principales (Features)
- Haute performance : exploitation de tous les cœurs CPU, utilisation d’un stockage en mémoire
- Optimisation mémoire : environ 200 MB de RAM par million de pairs
- Zéro configuration : exécution immédiate sans réglage supplémentaire
BitTorrent Enhancement Proposals (BEP) prises en charge
- BEP 0 : conformité à la spécification du protocole BitTorrent
- BEP 15 : prise en charge du protocole de tracker UDP
- BEP 23 : retour d’une liste de pairs compactée
- BEP 7 : extension tracker IPv6
- BEP 24 : retour de l’IP externe
- BEP 41 : extension du protocole de tracker UDP
- BEP 48 : extension Scrape du tracker (prise en charge partielle)
- BEP 52 : protocole BitTorrent v2
- Certaines fonctionnalités (BEP 27, 21, 31, etc.) ne sont pas encore implémentées ou sont prévues
- BEP 8 (obfuscation des pairs du tracker) n’est pas pris en charge
Autres fonctionnalités
- Prise en charge des connexions HTTPS
- Sauvegarde sur disque (renforcement de la sécurité des données)
- (Prévu) Gestion de liste blanche/liste noire des infohashes
- (Prévu) Gestion des pairs : autorisations, nettoyage périodique, expulsion, etc.
- (Prévu) Gestion des métriques/indicateurs et utilisation de GeoIP
- Aucun support prévu pour WebTorrent
Les suggestions des utilisateurs et développeurs sont acceptées via les issues
Mode d’exécution
- Exécution directe du code source
- Erlang et Elixir requis
- Cloner le dépôt, configurer l’environnement, puis exécuter
- Mode release
- Il n’existe pas de release officielle, mais la construction et le déploiement manuels sont pris en charge
- Copier les fichiers de release, configurer l’environnement, puis exécuter
- Docker
- Image de conteneur officielle disponible
- Exemple de fichier docker-compose fourni
- Il est recommandé d’utiliser des variables d’environnement pour la configuration dans le conteneur
Droits d’auteur et licence
- Copyright (c) Dahrkael <dahrkael at outlook dot com>
- Distribué sous licence Apache License 2.0
- Voir le fichier LICENSE du dépôt pour le détail de la licence
1 commentaires
Avis Hacker News
Déception de ne pas voir une conception centrée sur OTP, car le code réel adopte une approche presque procédurale où des systèmes basés sur ETS comme ETS ou Application sont manipulés directement à chaque fois.
Si l’auteur veut apprendre à concevoir des services en Elixir ou dans les langages BEAM, recommandation des ouvrages de référence "Designing Elixir Systems with OTP" de James Edward Gray et Bruce Tate, ainsi que "Functional Web Development with Elixir, OTP, and Phoenix" de Lance Halvorsen.
Un tracker torrent étant au final une base de données spécialisée, l’objectif le plus important est de traiter les données aussi vite que possible.
Intention néanmoins affichée de lire absolument les livres recommandés.
Impression qu’il y a quelque chose de particulier qui pousse les développeurs C++ à aimer Go et Elixir.
L’auteur du commentaire s’y reconnaît lui-même.
Idée que les personnes attirées par C++ pour les performances finissent par adorer les performances multithread de Go ou d’Elixir.
Avis positif qualifiant le projet de formidable.
Le pattern matching réduit la plupart des embranchements et de la complexité du code, ce qui rend le tout beaucoup plus propre.
Grâce à la philosophie "Let it crash", il est possible d’ignorer la plupart des cas d’exception tout en étant certain que, même si un vrai problème survient, son impact restera limité à un seul client.
En plus de dix ans d’applications déployées en Elixir, aucune interruption imprévue n’a été constatée.
Insistance sur le fait qu’en dehors de la maintenance et des mises à jour, la disponibilité a toujours été de 100 %.
Face aux clients, l’argument est que « les services construits en Elixir plutôt qu’en Python ou Go ne meurent jamais et offrent en plus un superbe dashboard », et beaucoup sont effectivement convaincus immédiatement.
Souhait de voir exister un langage système qui, comme Elixir, prendrait en charge les
struct, lesenumet le pattern matching dans les signatures de fonctions.Expérience similaire menée en Typescript pour apprendre BT (BitTorrent).
Puis réimplémentation en Rust pour apprendre Rust également.
Mon projet
Utilisation simple de redis comme base de données, alors qu’ici tout est chargé en mémoire, ce qui est jugé intéressant.
Curiosité quant aux réflexions, décisions amusantes ou difficultés liées à ce choix de conception.
À noter qu’avec la solution personnelle basée sur redis, lors de plusieurs
announce, les peers ne sont pas toujours mélangés aléatoirement.Les données de chaque peer peuvent être lues et écrites concurremment par chaque processus, ce qui minimise la contention et la latence.
La seule partie réellement séquentielle intervient lors de la création initiale d’un nouveau swarm, ce qui arrive rarement, donc ce n’est pas gênant.
Malheureusement, il n’existe pas de support natif pour extraire des lignes aléatoires d’une table, donc pour l’instant le swarm entier est chargé puis un sous-ensemble aléatoire est sélectionné manuellement.
Exemple de code lié
Projet jugé très réussi.
Souvenir d’avoir, par le passé, créé un tracker basique en Elixir.
Mon code
Se demande en particulier pourquoi il a été implémenté comme private tracker.
Félicitations pour la sortie du projet.
Demande de plus d’informations sur son fonctionnement par rapport à opentracker, notamment en matière de performances.
En revanche, extracker montre vraiment sa valeur quand le nombre de cœurs CPU atteint deux chiffres.
Aucun benchmark sérieux n’a encore été réalisé à ce stade.
Éloge d’un projet très bien réalisé.
Conseil simple : remplacer
IO.putsparLoggeret envisager aussi l’ajout d’OTel.Accord avec cette suggestion.
Avis selon lequel les applications intégrées
LoggeretTelemetrysuffisent déjà largement.Par la suite, il sera facile d’ajouter opentelemetry ou autre via les hooks Telemetry.
Documentation Logger
Documentation Telemetry
Question sur le sink otel préféré, c’est-à-dire l’endroit où envoyer les métriques.
Grand attachement à Elixir.
Développement en cours d’un excellent moteur de notification avec Elixir.
Admiration pour le fait qu’Elixir soit vraiment exceptionnel.
Question sur le fait de savoir s’il s’agit d’un projet privé ou d’un projet OSS (open source).
Constat que l’écosystème Elixir a besoin d’un meilleur moteur de notification.
Y a-t-il eu des projets de référence ?
Combien de temps le développement a-t-il pris ?
Par rapport à qbittorrent, jusqu’où les fonctionnalités marchent-elles ?
Le projet a commencé parce qu’un tracker était nécessaire pour un autre projet, mais le développement du tracker lui-même est devenu plus intéressant, ce qui a poussé à continuer.
Du code d’autres trackers a bien été consulté, mais la plupart étaient soit trop complexes, soit trop simples pour servir de bonne référence.
Le développement dure maintenant depuis trois mois, au fil de plusieurs nuits blanches de programmation.
Ce n’est pas un client comme qbittorrent, mais il existe une idée de futur projet de client orienté seedbox.
Explication qu’un tracker n’est pas un client torrent.
Après essai direct, constat que HTTPS ne fonctionne pas correctement.
De plus, le message d’avertissement suivant s’affiche en continu dans la console :
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused"
Malgré cela, tout semble fonctionner.
Souhait aussi de voir les statistiques HTTP, mais seules les statistiques UDP étaient visibles.
(UDP était pourtant désactivé.)
L’événement "paused" fait partie du BEP 21 et sert à indiquer au tracker que le client n’a toujours pas terminé mais ne télécharge plus.
Par exemple, cela peut être utilisé quand un utilisateur ne veut qu’une partie des fichiers d’un torrent.
Le
readmedu projet précise que BEP 21 n’est pas pris en charge.La Telemetry liée à HTTP est encore dans la liste des tâches à faire.
Comme le serveur web utilise une bibliothèque tierce, la bonne méthode d’intégration demande encore réflexion.
Pour utiliser HTTPS, il faut renseigner un chemin de certificat valide dans
:https_keyfile.Pour l’instant, si HTTPS est nécessaire, il est recommandé de placer Caddy ou Nginx devant le tracker.
Une intégration avec certbot est aussi prévue, mais comme la plupart des peers torrent utilisent UDP, la priorité reste faible.
Nouveau compliment sur le caractère vraiment impressionnant du projet.
Question pour savoir s’il est envisagé d’utiliser Elixir comme langage principal.
Réponse indiquant qu’Elixir est l’une des options principales.
Conviction personnelle qu’il serait clairement plus agréable d’y travailler qu’en C++.
Ce n’est pas son cas, mais présentation d’une personne travaillant avec Elixir depuis près de 9 ans et 2 mois, et sachant aussi utiliser Rust et Golang.
Question sur l’existence éventuelle de recrutements en cours.