Achter de schermen zijn we bij XXL Hosting bezig met een nieuwe versie van ons dashboard. Een van onze doelen is om onze klanten en resellers meer informatie te presenteren over hun websites en domeinnamen in dit dashboard. Je moet daarbij denken over welk CMS versie geinstalleerd is, hoe websites het doen op SEO- en performancevlak, en waar en hoe domeinnamen zijn geregistreerd. Deze gegevens moeten we eens in de zoveel tijd op de achtergrond updaten en bijhouden, en daarvoor gaan we een zogenaamd "job- en queue-systeem" voor gebruiken. Onze keuze is daarbij gevallen op RQ, en in deze blogpost laat ik zien hoe je dit ook zelf kunt installeren en gebruiken.
RQ staat voor Redis Queue, en is een simpel op Python gebaseerd systeem waarmee jobs in een wachtrij kunnen worden geplaatst en kunnen worden uitgevoerd.
Waarom heb je jobs en een wachtrij nodig? Soms duren systeemtaken te lang om ze uit te voeren wanneer een gebruiker een pagina bezoekt. De informatie moet dan dus al klaar staan. Door jobs en queues te gebruiken kun je de processen om deze informatie regelmatig te updaten, inplannen en laten uitvoeren klaarzetten op de achtergrond. Bij XXL Hosting hebben we het over tienduizenden domeinnamen en duizenden gehoste website die regelmatig gecheckt moeten worden.
RQ kun je op je eigen computer, of op een VPS bij ons draaien. In dit voorbeeld maak ik gebruik van rq-dashboard om een visuele weergave te geven van de jobs, queue en workers. De IDE die ik gebruik is Pycharm; ik zet dit op in Python.
De eerste stap is om een nieuwe project aan te maken, ik noem deze rq-blog.
Er zijn een aantal libraries die we nodig hebben. Deze installeer door gebruik te maken van pip. De commando's zijn als volgt:
pip install flask
pip install redis
pip install rq
pip install rq-dashboard
pip install counter
Nu de libraries gedownload zijn, is het tijd om de benodigde bestanden aan te maken. Ik begin met een bestand genaamd app.py:
from flask import Flask
from redis import Redis
from rq import Queue
from counter import visit
app = Flask(__name__)
q = Queue(connection=Redis())
@app.route('/visit')
def count_visit():
count = q.enqueue(visit)
return "Visit has been registered"
@app.route('/')
def return_visit_count():
count = Redis().get('count').decode('utf-8') if Redis().get('count') else '0'
return f'<h1> Congrats! Your are the visitor no.: {count} </h1>'
Het tweede bestand noem ik counter.py. Deze heeft de volgende code:
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
def visit():
if r.get('count') is None:
r.set('count', 1)
else:
r.incr('count')
Na het aanmaken van de bovenstaande bestanden is het tijd om rq te starten. Ik open 3 lokale terminals en voer ik 3 commando's uit:
Terminal 1: redis-server
Terminal 2: flask run
Terminal 3: rq-dashboard
Open dan je browser en navigeer naar http://localhost:9181. Je ziet hier een visuele weergave van rq. Om een job te starten verwijs ik je naar terminal 2, hier zie je dat flask op http://127.0.0.1:5000 draait. Open een nieuwe tab in je browser en open deze pagina.
Hier zie je vervolgens een counter staan, in deze voorbeeld is het bezoeken van een pagina een toggle om een job in de queue te starten. Om dit te doen kan je http://127.0.0.1:5000/visit bezoeken. Wanneer je dit bijvoorbeeld 3x doet, en je terug gaat naar je rq dashboard, zie je dat hier 3 jobs in de queue staan.
Nu deze jobs in de queue staan is het tijd om de worker te starten, deze zal de jobs uitvoeren. Open een extra terminal, en voer hier het "rq worker --with-scheduler" commando uit.
RQ zal vervolgens de jobs die in de queue staan voor je uitvoeren.
Mocht je meer willen weten over RQ, stuur ik je graag door naar hun website: https://python-rq.org
Meer informatie over rq-dashboard kan je hier vinden: https://github.com/Parallels/rq-dashboard
Heb je hierover vragen die je aan ons wilt stellen? Neem dan gerust contact met ons op!
Klik hier voor contact