SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
Messaging temps réel avec Go
Mickaël Rémond
ProcessOne
Retour d'expérience
Construction d'objets connectés en Go
Introduction: Pourquoi utiliser Go pour le
messaging ?
Pertinence
Go est pertinent pour le messaging temps réel:
sur le client: objets connectés
sur le serveur: plate-forme de messaging
Pour les clients / objets connectés
Channels: Le passage de messages est au coeur du language Go.
Cross compilation: Il est possible de compiler et déployer le code client sur une
architecture différente.
Accès système: La création d'objet est simplifiée par les capacités systèmes de Go.
Pour les serveurs
Performant sur deux axes:
Go routines: Connections simultanés
Les serveurs de messagerie gèrent de nombreux processus en parallèle
Performance: Débit
Permet de développer des systèmes ayant un fort débit en terme de nombre de
messages par seconde.
Latence:
Permet de réduire fortement la latence dans la transmission des messages.
Exemple: NATS
gnatsd, implementation du protocole Nats.io
NATS: Capacité de traitement
Source: Brave New Geek
NATS: Latence
Source: Brave New Geek
Illustration du messaging avec divers protocoles
À connaître:
XMPP: eXtensible Messaging and Presence Protocol
xmpp.org(http://xmpp.org)
MQTT: Message Queuing Telemetry Transport
mqtt.org(http://mqtt.org)
NATS: Protocole et serveur
nats.io(http://nats.io)
Cette présentation se concentre sur l'utilisation des serveurs de messaging depuis un
client Go.
La mise en œuvre de serveurs de messaging en pur Go viendra dans une autre
présentation.
Code
XMPP
XMPP est idéal pour le contrôle des objets.
Le protocole est extensible et propose des spécifications adaptées à l'écriture de
séquences d'interaction pour le contrôle:
Découverte (XEP-0347: Internet of Things - Discovery)
Contrôle: Requête / Réponse (XEP-0325: Internet of Things - Control)
Développement d'un Jukebox XMPP en Go
Technologies utilisées:
Protocole XMPP
ejabberd: serveur XMPP
Bibliothèque XMPP en Go, Gox: écriture du Jukebox
Raspberry Pi 2 avec image Linux custom et haut parleur connecté à la sortie son
analogique
Connexion à SoundCloud
Architecture
Contrôle XMPP du jukebox: Chat bot
Le jukebox joue les liens Soundcloud envoyés dans le chat:
<message type="chat" to="test@localhost" id="aac9a">
<body>https://soundcloud.com/radiohead/spectre</body>
</message>
Il stoppe la musique en cours de lecture avec la commande stop:
<message type="chat" to="test@localhost" id="aacaa">
<body>stop</body>
</message>
Contrôle du jukebox: IoT XMPP Control
Notre jukebox peut interpréter les requêtes de commande IoT (XEP-0325):
<iq type='set'
    to='test@localhost/jukebox'
    id='2'>
   <set xmlns='urn:xmpp:iot:control' xml:lang='en'>
     <string name='action' value='play'/>
     <string name='url' value='https://soundcloud.com/radiohead/spectre'/>
   </set>
</iq>
Code du jukebox: Main receive loop
Déclaration de la connection XMPP:
var client *xmpp.Client
var err error
if client, err = connectXmpp(*jid, *password, *address); err != nil {
log.Fatal("Could not connect to XMPP: ", err)
}
Boucle de traitement des paquets XMPP:
for packet := range client.Recv() {
switch packet := packet.(type) {
case *xmpp.ClientMessage:
processMessage(client, p, packet)
case *xmpp.ClientIQ:
processIq(client, p, packet)
case *xmpp.ClientPresence:
// Do nothing with received presence
default:
fmt.Printf("Ignoring packet: %Tn", packet)
}
}
Code du jukebox: Connexion XMPP
func connectXmpp(jid string, password string, address string) (client *xmpp.Client, err error) {
xmppOptions := xmpp.Options{Address: address,
Jid: jid, Password: password, PacketLogger: os.Stdout,
Retry: 10}
if client, err = xmpp.NewClient(xmppOptions); err != nil {
return
}
if _, err = client.Connect(); err != nil {
return
}
return
}
Traitement des messsages
func processMessage(client *xmpp.Client, p *mpg123.Player, packet *xmpp.ClientMessage) {
command := strings.Trim(packet.Body, " ")
if command == "stop" {
p.Stop()
} else {
playSCURL(p, command)
}
}
Traitement des commandes
func processIq(client *xmpp.Client, p *mpg123.Player, packet *xmpp.ClientIQ) {
switch payload := packet.Payload.(type) {
// We support IOT Control IQ
case *iot.ControlSet:
var url string
for _, element := range payload.Fields {
if element.XMLName.Local == "string" && element.Name == "url" {
url = strings.Trim(element.Value, " ")
break
}
}
playSCURL(p, url)
setResponse := new(iot.ControlSetResponse)
reply := xmpp.ClientIQ{Packet: xmpp.Packet{To: packet.From, Type: "result", Id: packet.Id}, Pay
client.Send(reply.XMPPFormat())
default:
fmt.Printf("Other IQ Payload: %Tn", packet.Payload)
}
}
Jouer le morceau SoundCloud
func playSCURL(p *mpg123.Player, rawURL string) {
songID, _ := soundcloud.GetSongID(rawURL)
url := soundcloud.FormatStreamURL(songID)
p.Play(url)
}
MQTT
MQTT est idéal pour remonter l'information venant de capteurs.
Reporting d'un capteur de température
Technologies utilisées:
Capteur: Températeur CPU OSX
sysctl -n machdep.xcpm.cpu_thermal_level
Serveur MQTT de test: Mosquitto
Bibliothèque MQTT en Go: ProcessOne MQTT
Publisher: Mise en place de la connexion
func main() {
client := mqtt.New("localhost:1883", nil)
client.ClientID = "mremond-osx"
if err := client.Connect(); err != nil {
log.Fatal("Connection error: ", err)
}
ticker := time.NewTicker(5 * time.Second)
stop := make(chan bool)
go publishLoop(client, ticker, stop)
runtime.Goexit()
}
Publisher: La boucle de publication
func publishLoop(client *mqtt.Client, ticker *time.Ticker, stop <-chan bool) {
for done := false; !done; {
select {
case <-ticker.C:
payload := make([]byte, 1, 1)
payload[0] = getTemp()
client.Publish(getTopic(client.ClientID), payload)
case <-stop:
done = true
break
}
}
}
Publisher: La lecture de la température
func getTemp() byte {
out, err := exec.Command("sysctl", "-n", "machdep.xcpm.cpu_thermal_level").Output()
if err != nil {
log.Println("Cannot read CPU temperature: ", err)
return byte(0)
}
s := string(out)
if temp, err := strconv.ParseInt(strings.Trim(s, "n"), 10, 32); err != nil {
return byte(temp)
}
return byte(0)
}
Subscriber
func main() {
messages := make(chan *mqtt.Message)
client := mqtt.New("localhost:1883", messages)
client.ClientID = "MQTT-Sub"
if err := client.Connect(); err != nil {
fmt.Printf("Connection error: %qn", err)
return
}
name := "mremond-osx/cputemp"
topic := packet.Topic{Name: name, QOS: 1}
client.Subscribe(topic)
for m := range messages {
fmt.Printf("Received message on topic %s: %+vn", m.Topic, m.Payload)
}
}
Prochaines étapes
Publication du code client MQTT:
Publication pour la fin de semaine, après nettoyage et documentation, sur le
compte Github de ProcessOne(https://github.com/processone/)
Présentation de ce que j'ai appris lors du design de l'API de la bibliothèque ?
Mise en oeuvre de serveurs de messaging en Go:
Présentation du serveur NATS ?: Illustration de NATS qui est un protocol non
standard mais également très performant.
Autres serveurs de messaging en Go.
Liens
Code des slides
github.com/processone/talks/tree/master/2016/go-paris-meetup
(https://github.com/processone/talks/tree/master/2016/go-paris-meetup)
Go XMPP
github.com/processone/gox(https://github.com/processone/gox)
Go MQTT
github.com/processone/mqtt(https://github.com/processone/mqtt)
Brave New Geek: Dissecting Message Queues
bravenewgeek.com/dissecting-message-queues/(http://bravenewgeek.com/dissecting-message-queues/)
Thank you
Mickaël Rémond
ProcessOne
mremond@process-one.net(mailto:mremond@process-one.net)
http://www.process-one.net/(http://www.process-one.net/)
@mickael(http://twitter.com/mickael)
Messaging temps réel avec Go

Contenu connexe

Tendances

Présentation de Apache Zookeeper
Présentation de Apache ZookeeperPrésentation de Apache Zookeeper
Présentation de Apache ZookeeperMichaël Morello
 
09 01 configuration du serveur samba
09 01 configuration du serveur samba09 01 configuration du serveur samba
09 01 configuration du serveur sambaNoël
 
Examen
Examen Examen
Examen TECOS
 
Etes vous prêts pour le succes ?
Etes vous prêts pour le succes ?Etes vous prêts pour le succes ?
Etes vous prêts pour le succes ?Steven VAN POECK
 
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston PostOpenStack Korea Community
 
Cours services web_fabrice_mourlin
Cours services web_fabrice_mourlinCours services web_fabrice_mourlin
Cours services web_fabrice_mourlinangeeLee
 
Présentation Microsoft Advanced Threat Analytics | Deep-Dive - MSCloud Summi...
Présentation Microsoft Advanced Threat Analytics  | Deep-Dive - MSCloud Summi...Présentation Microsoft Advanced Threat Analytics  | Deep-Dive - MSCloud Summi...
Présentation Microsoft Advanced Threat Analytics | Deep-Dive - MSCloud Summi...☁️Seyfallah Tagrerout☁ [MVP]
 
FreeBSD vs Linux, RMLL 2014
FreeBSD vs Linux, RMLL 2014FreeBSD vs Linux, RMLL 2014
FreeBSD vs Linux, RMLL 2014Loïc Tosser
 
3 switchport securité
3 switchport securité3 switchport securité
3 switchport securitémedalaa
 
Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfonyjeUXdiCode
 
Création des sites web pour débutant
Création des sites web pour débutantCréation des sites web pour débutant
Création des sites web pour débutantKorteby Farouk
 

Tendances (18)

Présentation de Apache Zookeeper
Présentation de Apache ZookeeperPrésentation de Apache Zookeeper
Présentation de Apache Zookeeper
 
OpenNMS
OpenNMSOpenNMS
OpenNMS
 
Serveurs
ServeursServeurs
Serveurs
 
WebSocket avec Java EE 7
WebSocket avec Java EE 7WebSocket avec Java EE 7
WebSocket avec Java EE 7
 
09 01 configuration du serveur samba
09 01 configuration du serveur samba09 01 configuration du serveur samba
09 01 configuration du serveur samba
 
Atelier 2
Atelier 2Atelier 2
Atelier 2
 
Examen
Examen Examen
Examen
 
APACHE HTTP
APACHE HTTPAPACHE HTTP
APACHE HTTP
 
Samba 4
Samba 4Samba 4
Samba 4
 
Etes vous prêts pour le succes ?
Etes vous prêts pour le succes ?Etes vous prêts pour le succes ?
Etes vous prêts pour le succes ?
 
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
 
Cours services web_fabrice_mourlin
Cours services web_fabrice_mourlinCours services web_fabrice_mourlin
Cours services web_fabrice_mourlin
 
Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013Messages queues - Socloz@PHPForum 2013
Messages queues - Socloz@PHPForum 2013
 
Présentation Microsoft Advanced Threat Analytics | Deep-Dive - MSCloud Summi...
Présentation Microsoft Advanced Threat Analytics  | Deep-Dive - MSCloud Summi...Présentation Microsoft Advanced Threat Analytics  | Deep-Dive - MSCloud Summi...
Présentation Microsoft Advanced Threat Analytics | Deep-Dive - MSCloud Summi...
 
FreeBSD vs Linux, RMLL 2014
FreeBSD vs Linux, RMLL 2014FreeBSD vs Linux, RMLL 2014
FreeBSD vs Linux, RMLL 2014
 
3 switchport securité
3 switchport securité3 switchport securité
3 switchport securité
 
Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfony
 
Création des sites web pour débutant
Création des sites web pour débutantCréation des sites web pour débutant
Création des sites web pour débutant
 

Similaire à Messaging temps réel avec Go

Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c mouad Lousimi
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesXavier MARIN
 
Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache PulsarBruno Bonnin
 
Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0Patrick Guimonet
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...sametmax
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfSouf212
 
Creation de cluster (Master et deux slave ) nfs, htcondor, mpi
Creation de cluster (Master et deux slave ) nfs, htcondor, mpiCreation de cluster (Master et deux slave ) nfs, htcondor, mpi
Creation de cluster (Master et deux slave ) nfs, htcondor, mpiKhalid EDAIG
 
173544 introduction-aux-sockets
173544 introduction-aux-sockets173544 introduction-aux-sockets
173544 introduction-aux-socketsnaimanaima1
 
Rapport application chat
Rapport application chatRapport application chat
Rapport application chatTbatou sanae
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosSaid Benaissa
 
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...Patrick Guimonet
 
Formation Play! framework
Formation Play! frameworkFormation Play! framework
Formation Play! frameworkBenoît Simard
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Kenny Dits
 
gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!David Caramelo
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !Carles Sistare
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...Publicis Sapient Engineering
 

Similaire à Messaging temps réel avec Go (20)

Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
 
Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache Pulsar
 
Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
 
8-socket.pdf
8-socket.pdf8-socket.pdf
8-socket.pdf
 
Les sockets.pptx
Les sockets.pptxLes sockets.pptx
Les sockets.pptx
 
Creation de cluster (Master et deux slave ) nfs, htcondor, mpi
Creation de cluster (Master et deux slave ) nfs, htcondor, mpiCreation de cluster (Master et deux slave ) nfs, htcondor, mpi
Creation de cluster (Master et deux slave ) nfs, htcondor, mpi
 
Introduction aux-sockets
Introduction aux-socketsIntroduction aux-sockets
Introduction aux-sockets
 
173544 introduction-aux-sockets
173544 introduction-aux-sockets173544 introduction-aux-sockets
173544 introduction-aux-sockets
 
Rapport application chat
Rapport application chatRapport application chat
Rapport application chat
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
 
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
 
Formation Play! framework
Formation Play! frameworkFormation Play! framework
Formation Play! framework
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?
 
gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
 

Plus de Mickaël Rémond

Go for Real Time Streaming Architectures - DotGo 2017
Go for Real Time Streaming Architectures - DotGo 2017Go for Real Time Streaming Architectures - DotGo 2017
Go for Real Time Streaming Architectures - DotGo 2017Mickaël Rémond
 
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8 Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8 Mickaël Rémond
 
Fighting XMPP abuse and spam with ejabberd - ejabberd Workshop #1
Fighting XMPP abuse and spam with ejabberd - ejabberd Workshop #1Fighting XMPP abuse and spam with ejabberd - ejabberd Workshop #1
Fighting XMPP abuse and spam with ejabberd - ejabberd Workshop #1Mickaël Rémond
 
Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Managing ejabberd Platforms with Docker - ejabberd Workshop #1Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Managing ejabberd Platforms with Docker - ejabberd Workshop #1Mickaël Rémond
 
Building Scalable Systems: What you can learn from Erlang - DotScale 2016
Building Scalable Systems: What you can learn from Erlang - DotScale 2016Building Scalable Systems: What you can learn from Erlang - DotScale 2016
Building Scalable Systems: What you can learn from Erlang - DotScale 2016Mickaël Rémond
 
Property-based testing of XMPP: generate your tests automatically - ejabberd ...
Property-based testing of XMPP: generate your tests automatically - ejabberd ...Property-based testing of XMPP: generate your tests automatically - ejabberd ...
Property-based testing of XMPP: generate your tests automatically - ejabberd ...Mickaël Rémond
 
IoT Studio #1: Protocols introduction and connected jukebox
IoT Studio #1: Protocols introduction and connected jukeboxIoT Studio #1: Protocols introduction and connected jukebox
IoT Studio #1: Protocols introduction and connected jukeboxMickaël Rémond
 
Deep Dive Into ejabberd Pubsub Implementation
Deep Dive Into ejabberd Pubsub ImplementationDeep Dive Into ejabberd Pubsub Implementation
Deep Dive Into ejabberd Pubsub ImplementationMickaël Rémond
 
2015: L'année d'Elixir, Code, écosystème et communauté
2015: L'année d'Elixir, Code, écosystème et communauté2015: L'année d'Elixir, Code, écosystème et communauté
2015: L'année d'Elixir, Code, écosystème et communautéMickaël Rémond
 
Archipel Introduction - ejabberd SF Meetup
Archipel Introduction - ejabberd SF MeetupArchipel Introduction - ejabberd SF Meetup
Archipel Introduction - ejabberd SF MeetupMickaël Rémond
 
A vision for ejabberd - ejabberd SF Meetup
A vision for ejabberd - ejabberd SF MeetupA vision for ejabberd - ejabberd SF Meetup
A vision for ejabberd - ejabberd SF MeetupMickaël Rémond
 
ProcessOne Push Platform: XMPP-based Push Solutions
ProcessOne Push Platform: XMPP-based Push SolutionsProcessOne Push Platform: XMPP-based Push Solutions
ProcessOne Push Platform: XMPP-based Push SolutionsMickaël Rémond
 
WaveOne server and client by ProcessOne
WaveOne server and client by ProcessOneWaveOne server and client by ProcessOne
WaveOne server and client by ProcessOneMickaël Rémond
 
Real time Web Application with XMPP and Wave
Real time Web Application with XMPP and WaveReal time Web Application with XMPP and Wave
Real time Web Application with XMPP and WaveMickaël Rémond
 

Plus de Mickaël Rémond (20)

Go for Real Time Streaming Architectures - DotGo 2017
Go for Real Time Streaming Architectures - DotGo 2017Go for Real Time Streaming Architectures - DotGo 2017
Go for Real Time Streaming Architectures - DotGo 2017
 
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8 Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
Phoenix Presence: Le service temps réel de Phoenix - Paris.ex #8
 
Fighting XMPP abuse and spam with ejabberd - ejabberd Workshop #1
Fighting XMPP abuse and spam with ejabberd - ejabberd Workshop #1Fighting XMPP abuse and spam with ejabberd - ejabberd Workshop #1
Fighting XMPP abuse and spam with ejabberd - ejabberd Workshop #1
 
Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Managing ejabberd Platforms with Docker - ejabberd Workshop #1Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Managing ejabberd Platforms with Docker - ejabberd Workshop #1
 
Building Scalable Systems: What you can learn from Erlang - DotScale 2016
Building Scalable Systems: What you can learn from Erlang - DotScale 2016Building Scalable Systems: What you can learn from Erlang - DotScale 2016
Building Scalable Systems: What you can learn from Erlang - DotScale 2016
 
Property-based testing of XMPP: generate your tests automatically - ejabberd ...
Property-based testing of XMPP: generate your tests automatically - ejabberd ...Property-based testing of XMPP: generate your tests automatically - ejabberd ...
Property-based testing of XMPP: generate your tests automatically - ejabberd ...
 
IoT Studio #1: Protocols introduction and connected jukebox
IoT Studio #1: Protocols introduction and connected jukeboxIoT Studio #1: Protocols introduction and connected jukebox
IoT Studio #1: Protocols introduction and connected jukebox
 
Deep Dive Into ejabberd Pubsub Implementation
Deep Dive Into ejabberd Pubsub ImplementationDeep Dive Into ejabberd Pubsub Implementation
Deep Dive Into ejabberd Pubsub Implementation
 
XMPP Academy #3
XMPP Academy #3XMPP Academy #3
XMPP Academy #3
 
XMPP Academy #2
XMPP Academy #2XMPP Academy #2
XMPP Academy #2
 
2015: L'année d'Elixir, Code, écosystème et communauté
2015: L'année d'Elixir, Code, écosystème et communauté2015: L'année d'Elixir, Code, écosystème et communauté
2015: L'année d'Elixir, Code, écosystème et communauté
 
XMPP Academy #1
XMPP Academy #1XMPP Academy #1
XMPP Academy #1
 
Archipel Introduction - ejabberd SF Meetup
Archipel Introduction - ejabberd SF MeetupArchipel Introduction - ejabberd SF Meetup
Archipel Introduction - ejabberd SF Meetup
 
A vision for ejabberd - ejabberd SF Meetup
A vision for ejabberd - ejabberd SF MeetupA vision for ejabberd - ejabberd SF Meetup
A vision for ejabberd - ejabberd SF Meetup
 
Multitasking in iOS 7
Multitasking in iOS 7Multitasking in iOS 7
Multitasking in iOS 7
 
ProcessOne Push Platform: XMPP-based Push Solutions
ProcessOne Push Platform: XMPP-based Push SolutionsProcessOne Push Platform: XMPP-based Push Solutions
ProcessOne Push Platform: XMPP-based Push Solutions
 
WaveOne server and client by ProcessOne
WaveOne server and client by ProcessOneWaveOne server and client by ProcessOne
WaveOne server and client by ProcessOne
 
Real time Web Application with XMPP and Wave
Real time Web Application with XMPP and WaveReal time Web Application with XMPP and Wave
Real time Web Application with XMPP and Wave
 
Erlang White Label
Erlang White LabelErlang White Label
Erlang White Label
 
OneTeam Media Server
OneTeam Media ServerOneTeam Media Server
OneTeam Media Server
 

Messaging temps réel avec Go

  • 1. Messaging temps réel avec Go Mickaël Rémond ProcessOne
  • 3. Introduction: Pourquoi utiliser Go pour le messaging ?
  • 4. Pertinence Go est pertinent pour le messaging temps réel: sur le client: objets connectés sur le serveur: plate-forme de messaging
  • 5. Pour les clients / objets connectés Channels: Le passage de messages est au coeur du language Go. Cross compilation: Il est possible de compiler et déployer le code client sur une architecture différente. Accès système: La création d'objet est simplifiée par les capacités systèmes de Go.
  • 6. Pour les serveurs Performant sur deux axes: Go routines: Connections simultanés Les serveurs de messagerie gèrent de nombreux processus en parallèle Performance: Débit Permet de développer des systèmes ayant un fort débit en terme de nombre de messages par seconde. Latence: Permet de réduire fortement la latence dans la transmission des messages.
  • 8. NATS: Capacité de traitement Source: Brave New Geek
  • 10. Illustration du messaging avec divers protocoles À connaître: XMPP: eXtensible Messaging and Presence Protocol xmpp.org(http://xmpp.org) MQTT: Message Queuing Telemetry Transport mqtt.org(http://mqtt.org) NATS: Protocole et serveur nats.io(http://nats.io) Cette présentation se concentre sur l'utilisation des serveurs de messaging depuis un client Go. La mise en œuvre de serveurs de messaging en pur Go viendra dans une autre présentation.
  • 11. Code
  • 12. XMPP XMPP est idéal pour le contrôle des objets. Le protocole est extensible et propose des spécifications adaptées à l'écriture de séquences d'interaction pour le contrôle: Découverte (XEP-0347: Internet of Things - Discovery) Contrôle: Requête / Réponse (XEP-0325: Internet of Things - Control)
  • 13. Développement d'un Jukebox XMPP en Go Technologies utilisées: Protocole XMPP ejabberd: serveur XMPP Bibliothèque XMPP en Go, Gox: écriture du Jukebox Raspberry Pi 2 avec image Linux custom et haut parleur connecté à la sortie son analogique Connexion à SoundCloud
  • 15. Contrôle XMPP du jukebox: Chat bot Le jukebox joue les liens Soundcloud envoyés dans le chat: <message type="chat" to="test@localhost" id="aac9a"> <body>https://soundcloud.com/radiohead/spectre</body> </message> Il stoppe la musique en cours de lecture avec la commande stop: <message type="chat" to="test@localhost" id="aacaa"> <body>stop</body> </message>
  • 16. Contrôle du jukebox: IoT XMPP Control Notre jukebox peut interpréter les requêtes de commande IoT (XEP-0325): <iq type='set'     to='test@localhost/jukebox'     id='2'>    <set xmlns='urn:xmpp:iot:control' xml:lang='en'>      <string name='action' value='play'/>      <string name='url' value='https://soundcloud.com/radiohead/spectre'/>    </set> </iq>
  • 17. Code du jukebox: Main receive loop Déclaration de la connection XMPP: var client *xmpp.Client var err error if client, err = connectXmpp(*jid, *password, *address); err != nil { log.Fatal("Could not connect to XMPP: ", err) } Boucle de traitement des paquets XMPP: for packet := range client.Recv() { switch packet := packet.(type) { case *xmpp.ClientMessage: processMessage(client, p, packet) case *xmpp.ClientIQ: processIq(client, p, packet) case *xmpp.ClientPresence: // Do nothing with received presence default: fmt.Printf("Ignoring packet: %Tn", packet) } }
  • 18. Code du jukebox: Connexion XMPP func connectXmpp(jid string, password string, address string) (client *xmpp.Client, err error) { xmppOptions := xmpp.Options{Address: address, Jid: jid, Password: password, PacketLogger: os.Stdout, Retry: 10} if client, err = xmpp.NewClient(xmppOptions); err != nil { return } if _, err = client.Connect(); err != nil { return } return }
  • 19. Traitement des messsages func processMessage(client *xmpp.Client, p *mpg123.Player, packet *xmpp.ClientMessage) { command := strings.Trim(packet.Body, " ") if command == "stop" { p.Stop() } else { playSCURL(p, command) } }
  • 20. Traitement des commandes func processIq(client *xmpp.Client, p *mpg123.Player, packet *xmpp.ClientIQ) { switch payload := packet.Payload.(type) { // We support IOT Control IQ case *iot.ControlSet: var url string for _, element := range payload.Fields { if element.XMLName.Local == "string" && element.Name == "url" { url = strings.Trim(element.Value, " ") break } } playSCURL(p, url) setResponse := new(iot.ControlSetResponse) reply := xmpp.ClientIQ{Packet: xmpp.Packet{To: packet.From, Type: "result", Id: packet.Id}, Pay client.Send(reply.XMPPFormat()) default: fmt.Printf("Other IQ Payload: %Tn", packet.Payload) } }
  • 21. Jouer le morceau SoundCloud func playSCURL(p *mpg123.Player, rawURL string) { songID, _ := soundcloud.GetSongID(rawURL) url := soundcloud.FormatStreamURL(songID) p.Play(url) }
  • 22. MQTT MQTT est idéal pour remonter l'information venant de capteurs.
  • 23. Reporting d'un capteur de température Technologies utilisées: Capteur: Températeur CPU OSX sysctl -n machdep.xcpm.cpu_thermal_level Serveur MQTT de test: Mosquitto Bibliothèque MQTT en Go: ProcessOne MQTT
  • 24. Publisher: Mise en place de la connexion func main() { client := mqtt.New("localhost:1883", nil) client.ClientID = "mremond-osx" if err := client.Connect(); err != nil { log.Fatal("Connection error: ", err) } ticker := time.NewTicker(5 * time.Second) stop := make(chan bool) go publishLoop(client, ticker, stop) runtime.Goexit() }
  • 25. Publisher: La boucle de publication func publishLoop(client *mqtt.Client, ticker *time.Ticker, stop <-chan bool) { for done := false; !done; { select { case <-ticker.C: payload := make([]byte, 1, 1) payload[0] = getTemp() client.Publish(getTopic(client.ClientID), payload) case <-stop: done = true break } } }
  • 26. Publisher: La lecture de la température func getTemp() byte { out, err := exec.Command("sysctl", "-n", "machdep.xcpm.cpu_thermal_level").Output() if err != nil { log.Println("Cannot read CPU temperature: ", err) return byte(0) } s := string(out) if temp, err := strconv.ParseInt(strings.Trim(s, "n"), 10, 32); err != nil { return byte(temp) } return byte(0) }
  • 27. Subscriber func main() { messages := make(chan *mqtt.Message) client := mqtt.New("localhost:1883", messages) client.ClientID = "MQTT-Sub" if err := client.Connect(); err != nil { fmt.Printf("Connection error: %qn", err) return } name := "mremond-osx/cputemp" topic := packet.Topic{Name: name, QOS: 1} client.Subscribe(topic) for m := range messages { fmt.Printf("Received message on topic %s: %+vn", m.Topic, m.Payload) } }
  • 28. Prochaines étapes Publication du code client MQTT: Publication pour la fin de semaine, après nettoyage et documentation, sur le compte Github de ProcessOne(https://github.com/processone/) Présentation de ce que j'ai appris lors du design de l'API de la bibliothèque ? Mise en oeuvre de serveurs de messaging en Go: Présentation du serveur NATS ?: Illustration de NATS qui est un protocol non standard mais également très performant. Autres serveurs de messaging en Go.
  • 29. Liens Code des slides github.com/processone/talks/tree/master/2016/go-paris-meetup (https://github.com/processone/talks/tree/master/2016/go-paris-meetup) Go XMPP github.com/processone/gox(https://github.com/processone/gox) Go MQTT github.com/processone/mqtt(https://github.com/processone/mqtt) Brave New Geek: Dissecting Message Queues bravenewgeek.com/dissecting-message-queues/(http://bravenewgeek.com/dissecting-message-queues/)