Circus, gestion de processus & sockets

imgs/circus_top.jpg

Presenter Notes

À quoi ça sert ?

  • Vie et mort des process
  • Relancer automatiquement
  • Stats par process / par service
  • Gestion centralisée
  • D'une machine à l'autre

Presenter Notes

Cas d'utilisation Mozilla

Presenter Notes

imgs/tokenserver.png

Presenter Notes

  • 175 process de crypto / machine
  • Limites de Popen
  • Ajouter / virer des workers à la volée

Presenter Notes

Par rapport aux "autres"

  • Notre besoin: Évolutif, en python
  • Supervisord: python, pas trop extensible, pas de streaming de stdout
  • Bluepill: bien mais: DSL à apprendre, pas très "mature", en ruby.

Presenter Notes

Et donc …

  • Utilisation de zmq
  • gestion possible à distance
  • Stats en temps réel
  • Streaming de stdout / stderr
  • Facilement extensible (pas forcement en python)
  • Gestion des sockets

Presenter Notes

À quoi ça ressemble ?

[watcher:dummy]
cmd = /chemin/vers/votre/executable $(circus.wid)
numprocesses = 5

[plugin:flapping]
use = circus.plugins.flapping.Flapping
retry_in = 3
max_retry = 2

circusd monfichier.ini

Presenter Notes

Architecture

Presenter Notes

imgs/archi1.png

Presenter Notes

imgs/archi2.png

Presenter Notes

imgs/archi3.png

Presenter Notes

Gestion des sockets

[circus]
endpoint = tcp://127.0.0.1:5555
pubsub_endpoint = tcp://127.0.0.1:5556
stats_endpoint = tcp://127.0.0.1:5557

[watcher:web]
cmd = chaussette --fd ${socket:web} server.app
use_sockets = True
numprocesses = 5

[socket:web]
host = 0.0.0.0
port = 8000
  • Un file descriptor est partagé entre plusieurs workers
  • Gestion au niveau système

Presenter Notes

Stack classique

imgs/classical-stack.png

Presenter Notes

Stack circus

imgs/circus-stack.png

Presenter Notes

Démo

Presenter Notes

Étendre circus

imgs/plug.jpg

Presenter Notes

from circus.plugins import CircusPlugin


class Logger(CircusPlugin):

    name = 'logger'

    def __init__(self, filename, **kwargs):
        super(Logger, self).__init__(**kwargs)
        self.filename = filename
        self.file = None

    def handle_init(self):
        self.file = open(self.filename, 'a+')

    def handle_stop(self):
        self.file.close()

    def handle_recv(self, data):
        topic, msg = data
        self.file.write('%s::%s' % (topic, msg))

Presenter Notes

Mais pas uniquement en python !

Presenter Notes

Le futur de circus

imgs/party.jpg

Presenter Notes

  • 0.6: dans les jours qui arrivent (env variables, support des tunnels ssh, hooks…)
  • 0.7: Gestion du clustering, cadeau de noël ?