Labo 1 - Résilience face aux pannes

Informations Générales

Notez enfin que l’objectif étant pour vous d’apprendre, vous serez toujours légitimes et bienvenu.e.s à nous poser des questions, sur Go, la théorie, vos idées, vos blocages. Si vous vous sentez perdu.e.s ou coincé.e.s, c’est qu’il faut nous demander.

ChatsApp

Ce cours contiendra quatre labos consécutifs, construisant chacun sur le précédent. L’objectif final sera d’avoir construit une application de messagerie instantanée décentralisée, baptisée ChatsApp, qui sera telle que

ChatsApp est une application distribuée. Chaque utilisateur.ice lance l’exécutable du serveur et lui fournit sa configuration. Durant le développement, la commande go run peut être utilisée.

go run ./cmd/server/main.go <local_address> <config_file_path>

Ce fichier de configuration est au format JSON, et inclut les champs suivants :

Une fois lancé, un serveur attend qu’un message soit entré sur la ligne de commande pour l’envoyer à tous ses voisins. Ces derniers l’afficheront dans la console sous le format <user>: <message>, suivit d’un saut de ligne.

Si PrintReadAck est configuré à true, l’envoyeur affichera un message de la forme [<neighbor_address> received: <message>] dès que le voisin d’adresse IP <neighbor_address> l’informe avoir reçu et traité ce message.

Format des labos

Chaque labo durera quatre semaines de cours (excepté le labo 1, qui en durera trois). Chacun se divisera en deux phases.

Avec chaque labo, sera attendu un document d’architecture logicielle décrivant votre solution.


Labo 1

Introduction

Ce labo a les objectifs suivants.

L’intégration devra permettre de fournir un accusé de réception pour chaque message envoyé et correctement reçu par le destinataire.

État actuel

Dans le passé, ChatsApp utilisait TCP pour la communication entre serveurs. Considéré trop lourd, le responsable du projet a décidé de le remplacer par UDP. Une implémentation fonctionnelle existe, mais elle fait perdre certaines des garanties offertes par TCP, notamment l’absence de perte de messages. L’implémentation de TCP reste disponible dans le code pour votre curiosité, mais ne sera pas utilisée dans les labos de ce cours.

Architecture du module UDP

Le module UDP se compose des goroutines suivantes.

Toutes ces transmissions se font via des channels. Comme il se doit, celles-ci ne sont lues que par une seule goroutine, mais peuvent être écrites par plusieurs.

La base de code fournie inclut également un module utils, qui contient quelques utilitaires, notamment

Vous serez libres d’utiliser ces utilitaires, mais aussi d’en ajouter d’autres si vous le jugez nécessaire.

RR

Pour combler les lacunes du module udp, vous êtes chargé.e.s de

Le module RR doit implémenter les deux cotés du protocole RR vu en cours.

Afin de rendre le module RR indépendant du moyen de communication entre serveurs (TCP, UDP, channels, …), il prend un NetWrapper en paramètre de son constructeur, qui n’est autre qu’une paire de channels :

Tests

La plupart des modules du projet incluent des tests unitaires. C’est notamment le cas des modules rr et udp, qui ne passent pas tous dans l’état actuel du code.

L’évaluation de votre travail inclura le passage de tous les tests fournis, y inclus ceux des autres modules pour détecter toute régression, notamment ceux de server, qui dépendent d’udp.

Nous vous encourageons à écrire vos propres tests, mais vous ne devez pas modifier ceux fournis. Dans les prochains labos, nous nous réserverons le droit de ne pas vous fournir tous les tests utilisés pour l’évaluation.

Document d’architecture

Votre rendu final devra inclure un document d’architecture logicielle décrivant votre solution. Son objectif sera de décrire de manière complète le fonctionnement conceptuel de votre code. Cela signifie qu’il devra notamment décrire

Votre objectif avec ce document est de nous permettre, en le lisant, d’avoir une idée claire et complète de l’architecture de votre code, et de la manière dont ses différentes parties fonctionnent ensemble pour offrir les fonctionnalités attendues. Nous l’utiliserons comme point d’entrée à votre rendu, veillez donc à nommer clairement les objets, goroutines et channels que vous mentionnez, afin de nous permettre de les retrouver facilement dans votre code.

Contraintes

En cas de doute, n’hésitez pas à nous demander.

Résumé

En résumé, vous devrez dans ce labo

Timeline et indications

Durant la première semaine, il est attendu que vous réfléchissiez à l’approche que vous souhaitez adopter pour implémenter ce labo. Il vous faudra notamment réfléchir à la manière de résoudre les problèmes suivants.

La deuxième séance de labo sera votre dernière occasion de valider auprès de nous votre proposition de solution. Une fois ce délai passé, il sera attendu que vous ayez une vision claire de votre solution, dont vous pourrez aussitôt commencer l’implémentation.

Le rendu aura lieu une minute avant le début du labo 2. Vous aurez donc trois semaines exactement