CodeDays 2019, München: Vortrag von Alex Krause (@alex0ptr, Senior Softwareingenieur bei QAware)
=== Dokument bitte herunterladen, falls unscharf! Please download slides if blurred! ===
Abstract:
Die meisten Backend-Systeme führen neben den kontinuierlich laufenden Prozessen, die einen Web-Service ausmachen, auch zeitlich gesteuerte Prozesse durch. Diese sind notwendig, um zu regelmäßigen Zeitpunkten Reports zu generieren, Housekeeping und Backups durchzuführen, E-Mails zu versenden oder Caches neu aufzubauen. Der bekannte Cron-Daemon automatisiert solche Prozesse schon fast seit Anbeginn der Computer-Ära. Beim Versuch, dieses Tool auf die von Microservices, Cloud und Container getriebene Welt anzuwenden, stellen sich jedoch Fragen: Wie kann ich meine Cron-Prozesse auf mehrere Instanzen verteilen? Wie garantiere ich die Ausführung des Tasks, wenn mein Container jederzeit heruntergefahren und ausgetauscht werden kann? Wie gestalte ich eine rollierende Ausführung über Container hinweg oder garantiere das ein Task nur einmal pro Zeiteinheit in meinem Cluster ausgeführt wird?
Um diese Fragen zu beantworten und für jeden das richtige Tool zu finden, schauen wir uns in diesem Talk zehn verschiedene Optionen für Cloud-Nnatives Cron an. Hierbei bedienen wir uns unter anderem bei Frameworks, Microservices, AWS Cloud-Infrastruktur, Serverless-Komponenten, Container-Orchestrierung und einem Kubernetes-Operator. Nebenbei bewerten wir, ganz subjektiv, die Cloud-nativeness, die Flexibilität der Lösung sowie den Aufwand bei Integration und Monitoring.
2. „Jeden Tag um 06:45 Uhr berechnet der Service aus
dem aktuellen Datenbestand die Menge der reservierten
Kontingente. Der resultierende Report soll persistiert und
per eMail an den Fachbereich gesendet werden.“
@alex0ptr
22. @alex0ptr
// define the job and tie it to our MyJob class
JobDetail job = newJob(MyJob.class)
.withIdentity("job1", "group1")
.build();
// Trigger the job to run now, and then repeat every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
25. #6: ok, dann machen wir
das halt selbst…
@alex0ptr
0
26. 1 Zutaten
1. Scheduler (z.B. cron, Quartz)
2. Verteilter Lock (z.B. etcd,
Hazelcast, Redis)
3. Viel Arbeit
@alex0ptr
27. Bash + Redis =
http://github.com/kvz/cronlock
“Uses a central Redis server to globally lock cronjobs
across a distributed system. This can be usefull if you
have 30 webservers that you deploy crontabs to (such as
mailing your customers), but you don't want 30 cronjobs
spawned.”
echo '0 8 * * * CRONLOCK_HOST=redis.mydomain.com cronlock /var/www/mail_customers.sh' | crontab