Batch per Cron, Tasks und Backends mit Google App Engine realisieren

Mit der Google App Engine ist es sehr einfach möglich langlaufende Programme per Batch im Hintergrund asynchron zu starten. Kleine Tasks mit einer Laufzeit von bis zu 10 Minuten können über den Webserver ausgeführt werden. Für echte Batches, die mehreren Stunden dauern, können mehrere separate Backend Server genutzt werden.

Das Limit liegt derzeit bei 48 GHz für die CPU und 10 GB für den RAM. Die kleinste Serverinstanz mit 600 MHz und 128 MB kosten ab 0,08 US-Dollar pro Stunde. Insgesamt können bis zu fünf verschiedene Backends definiert werden.

Google Appengine Backends

GAE Admin Console Backends

Die zugehörige Konfigurationsdatei backends.yaml sieht z.B. so aus:

backends:

- name: tinybackend
class: B1
instances: 1
options: dynamic

- name: smallbackend
class: B2
instances: 1
options: dynamic

- name: mediumbackend
class: B4
instances: 1
options: dynamic

- name: largebackend
class: B8
instances: 1
options: dynamic

- name: clusterbackend
class: B8
instances: 8
options: dynamic

Wichtig ist, dass die Backends extra hochgeladen werden müssen!

appcfg.py backends update .

Folgende Fehlermeldung erhält man, wenn man das Limit von 10 GB überschreitet:

Starting update of app: appid, backend: clusterbackend
Scanning files on local disk.
Error 400:
--- begin server output ---
Total memory used across all backends is 12160M, which exceeds the maximum allowed amount of 10240M.
--- end server output ---

RAM auf maximal 9.216 MB anpassen (9x 1.024 MB):

- name: clusterbackend
class: B8
instances: 9
options: dynamic

Als nächsten konfigurieren wir ein Batchskript in der app.yaml:

application: appid
version: 1
runtime: python
api_version: 1

handlers:

- url: /backend/.*
script: shp/sys/backend.py
login: admin
secure: optional

Dieses Skript wird so als normale Task (maximal 10 Minuten Laufzeit) ausgerufen:

from google.appengine.api import taskqueue
taskqueue.add(
url='/backend/',
params={'txt':'task'}
)

oder so als Backend (unbegrenzte Laufzeit):

from google.appengine.api import taskqueue
import os
if os.environ['SERVER_SOFTWARE'].lower().startswith('dev'):
taskqueue.add(
url='/backend/',
params={'txt':'backend'}
)
else:
taskqueue.add(
url='/backend/',
target='tinybackend', method='GET',
params={'txt':'backend'}
)

PS: die IF-Abfrage brauchen wir nur in der lokalen Testumgebung.

Advertisements

One Response to Batch per Cron, Tasks und Backends mit Google App Engine realisieren

  1. RoHa says:

    Ergänzung zu dynamischen Backends:

    Ein Stop ist aus Kostengründen nicht notwendig, da dynamische Backend-Instanzen analog zur dynamischen Frontend-Instanz nach 15 Minuten ohne Request automatisch beendet werden (http://code.google.com/appengine/docs/python/backends/overview.html).Das Backend wird nicht gestoppt, sondern es wird der Server für andere Backend freigegeben.

    “ … states that the billing for a dynamic backend stops 15 minutes after the last request is processed …“

    Ein Cronjob im Tinybackend, der alle 2 Stunden für 15 Minuten arbeitet, kosten am Tag 0,48 Dollar. Durch die Freigrenze von 0,72 Dollar bleiben so noch 0,24 Dollar für einen täglichen Batch von 30 Minuten mit dem Mediumbackend.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: