Labo 3 - Load balancing

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.

Introduction

Ce labo a pour objectif de compléter l’application ChatsApp pour permettre à des clients de s’y connecter sans surcharger un serveur en particulier.

Vous aurez accès, comme point de départ, à la solution du labo 2 ainsi qu’à un client et aux interfaces des abstractions à implémenter.

État actuel

Dans le code de départ de ce labo, l’utilisateur.ice ne communique plus directement avec l’exécutable du serveur, mais à travers un client. Les modifications que nous vous fournissons par rapport au labo 2 sont les suivantes :

Afin de gérer la connexion des clients, le protocole de communication client-serveur suivant est mis en place :

Notez que, pour des raisons de simplicité, un seul client par nom d’utilisateur n’est autorisé à se connecter au système à la fois. Si plusieurs clients se connectent au nom du même utilisateur, le comportement n’est pas défini.

Modifications attendues

Actuellement, le serveur répond à tout ConnRequestMessage par un ConnResponseMessage contenant sa propre adresse. En d’autres termes, il accepte toute demande de connexion, sans condition.

Le but de ce labo est d’implémenter un algorithme d’élection utilisé par les serveurs pour élire celui ayant le moins de clients connectés. Lorsqu’un client envoie un ConnRequestMessage, le serveur doit répondre par un ConnResponseMessage contenant l’adresse de cet élu.

Pour ce faire, vous devrez implémenter :

Le crElector créera donc et utilisera un mainteneur d’anneau pour implémenter l’algorithme d’élection de Chang et Roberts. Il devra déclencher une nouvelle élection à chaque changement d’aptitude, et non au moment d’un appel à GetLeader (sauf si aucun leader n’a encore été déterminé). L’électeur sera ensuite utilisé par le clientsManager pour répondre correctement aux demandes de connexion des clients.

Tests

Des tests sont fournis pour vérifier le bon fonctionnement de votre maintainer, crElector, et clientsManager.

Comme au labo 2, nous n’avons pas fourni tous les tests utilisés pour évaluer votre rendu. Nous attendons de votre part que vous implémentiez des tests additionnels, pour vérifier notamment les propriétés suivantes, et possiblement d’autres (sachant que nous nous permettrons d’exécuter des tests couvrant plus de propriétés que celles listées ci-dessous, lors de l’évaluation) :

Votre note dépendra en grande partie des résultats des tests (les votres, ceux que nous n’avons pas fournis, et ceux fournis, y inclus ceux des autres modules pour détecter toute régression). La qualité de vos tests sera également prise en compte dans l’évaluation.

Tous les tests devront passer sans et avec le data race detector de Go (go test -race).

Document d’architecture logicielle et Contraintes

Les mêmes exigences que pour le labo 1 s’appliquent ici concernant le document d’architecture logicielle, et les contraintes.

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.

Après cette semaine, la 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 4. Vous aurez donc quatre semaines (vacances exclues).