CESI: Architectures N Tiers, ajout mini projet 'Alfred'

This commit is contained in:
wpetit 2018-03-05 19:07:27 +01:00
parent 5f537a3a77
commit 7c0f21ae7f
5 changed files with 152 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,134 @@
<style>
pre { font-size: 0.5em !important; }
table { font-size: 0.5em !important; }
</style>
# Mini projet
## "Alfred", assistant personnel décentralisé
### William Petit - S.C.O.P. Cadoles
---
<!-- page_number: true -->
## Les "chatbots"
> ou "agents conversationnels"
- Interface homme/machine basée sur la "conversation"
- Regain d'intêret ces dernières années avec la montée en puissance de "l'intelligence artificielle"
---
## IRC
- Conception en 1988, [standardisation](https://tools.ietf.org/html/rfc2812) en 1993, inspiré du réseau Bitnet
- Protocole basé sur TCP et l'échange de messages au format texte
- Interaction avec le serveur basée sur des commandes `/join`, `/quit`, `/msg`...
### Freenode
- Mis en place en 1995
- Un réseau de serveurs IRC dédié aux projets libres et open source
- Accès gratuit et maintenu par la communauté
---
## NATS
https://nats.io/
- Un bus de message basé sur le protocole TCP et des données échangées au format texte.
- Modèle abonnement/publication et requête/réponse
- Des connecteurs pour de multiples langages: [PHP](https://github.com/repejota/phpnats), [NodeJS](https://github.com/nats-io/node-nats), [Java](https://github.com/nats-io/java-nats), [etc](https://nats.io/download/)
---
## Exemple de séquence d'échange
![center 120%](./img/messaging_sequence.png?3)
---
## Votre projet: Alfred, assistant personnel décentralisé
- Observe les conversations sur un canal IRC
- Fournit des "services" sous la forme de "commandes" aux utilisateurs du canal
- Composé de services indépendants communicants via un bus de message (NATS)
---
## Quels types de services ? (1)
- Alfred fait une recherche Wikipédia et affiche le lien de la page associée lorsqu'un utilisateur mets le marqueur `!wiki` dans un message sur le canal IRC.
- Alfred fait une recherche Youtube et affiche le lien du premier résultat lorsqu'un utilisateur mets le marqueur `!yt`
- Alfred enregistre les messages des utilisateurs en base de données et fournit une interface Web qui permet de faire une recherche dans l'historique des messages. Une commande permet également d'effectuer une recherche dans l'historique.
- Alfred se connecte via IMAP à une boite de réception partagée et envoie un message sur le canal lorsqu'un courriel arrive sur cette boite.
---
## Quels types de services ? (2)
- Alfred affiche la liste de ses fonctionnalités lorsqu'un utilisateur utilise le marqueur `!help`
- Alfred publie automatiquement les messages d'un compte Twitter donné sur le canal de communication
- Alfred fait une recherche sur l'API OpenStreetMap et retourne le lien vers la carte interactive de l'adresse recherchée lorsqu'un utilisateur utiliser le marqueur `!map`
- Alfred publie la météo du jour à une fréquence donnée sur le canal de communication
- D'autres idées ?
---
## Vue d'ensemble
![center 100%](./img/architecture.png?2)
---
## irc2nats
- Une passerelle entre un serveur IRC et un serveur NATS
- Publie des messages avec le sujet `irc.message.<channel>` avec un corps de message au format JSON
- S'abonne aux messages avec le sujet `irc.message.send` et transfert le message NATS sur le canal IRC
---
## NATS: tester l'envoi/réception de messages
1. Télécharger l'utilitaire [nuts](https://forge.cadoles.com/wpetit/nuts/releases) pour votre système d'exploitation
2. Pour envoyer un message:
```shell
./nuts publish <sujet> <message>
```
3. Pour écouter les messages pour un sujet
```shell
./nuts subscribe <sujet> </chemin/script/à/exécuter>
```
---
## Objectifs de la journée
Vous pouvez choisir le service que vous voulez implémenter parmi les exemples pour Alfred. Vous pouvez travailler en groupe ou seul.
Vous pouvez également proposer votre propre idée, la seule contrainte est l'usage de NATS pour l'échange de messages et, si possible, d'utiliser une API externe.
Si vous arrivez à implémenter une fonctionnalité en entier, vous pouvez l'améliorer ou passer à une autre.
---
## Problématiques à résoudre
> Réflechissez à ces questions pendant que vous travaillez sur vos services respectifs. Quelles réponses pourriez-vous me donner à la fin de la journée ?
- Comment gérer l'échec d'une partie de l'application ?
- Comment superviser le bon fonctionnement de l'ensemble de l'application ?
- Comment partager des données persistentes entre les différents services ? (ex: la liste des utilisateurs de l'application ?)
- Comment gérer les droits sur certaines commandes ? (ex: commandes d'administration)
---
# Licence
## CC BY-NC-SA 3.0 FR
[Creative Commons - Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 3.0 France](https://creativecommons.org/licenses/by-nc-sa/3.0/fr/)

Binary file not shown.

View File

@ -0,0 +1,18 @@
msc {
wordwraparcs=true, hscale=3, width=800;
Service_1,Service_2,Service_3,NATS_Server;
Service_1->NATS_Server [ label = "Connexion au serveur" ];
Service_2->NATS_Server [ label = "Connexion au serveur" ];
Service_3->NATS_Server [ label = "Connexion au serveur" ];
...;
Service_1->NATS_Server [ label = "Abonnement au sujet 'my.subject'" ];
Service_2->NATS_Server [ label = "Abonnement au sujet 'my.subject'" ];
...;
Service_3->NATS_Server [ label = "Publication d'un message avec le sujet 'my.subject'" ];
NATS_Server->Service_1 [ label = "Transfère du message 'my.subject' à l'abonné" ];
NATS_Server->Service_2 [ label = "Transfère du message 'my.subject' à l'abonné" ];
}