Google App Engine Python:スケジュール、キャッシュ、テンプレートによる効率的更新(1)。- cron.yaml

Google App Engine は、アプリケーションを決まった時刻に起動できるサービス「cron」を使用したスケジュール・タスクを提供する。
また、Google App Engine には、メモリ・オブジェクト・キャッシュ・システム「memchace」で、データをキャッシュできる仕組みが用意されている。
これらと template/テンプレート を併用することで、WEBページのコンテンツを効率よく更新することができる。

例えば、ランキングデータを取得して、ページに表示することを考えよう。

ランキングデータが1日に1回しか更新されない場合、ランキングデータの取得も1日に1回行えば十分である。そして、取得したデータを元に、テンプレートに埋め込む HTML の断片を生成して、memcache に保存する。ページへのリクエストが合ったときは、memcache から HTML の断片を取得して、これをテンプレートに埋めて表示する。

もし、cron を利用できなかったとしたら、ページへのリクエストがある都度、ランキングデータを取得しなければならない。同じ内容しか返ってこないのに、その度にランキングデータのリクエストを行うことは、そのリクエストを送る側も、リクエストに応える側にとっても、無駄な負荷を生じさせることになる。まったくの無駄だ。

これからもわかるように、タスク・スケジュール cron は大変に有用だ。

Google App Engine の「タスク・スケジュール 」は、app.yaml に記述する。

cron:
- description: daily ranking job
  url: /cron/daily
  schedule: every day of month 00:12
  timezone: Asia/Tokyo 

description は、このタスクに付けた名前もしくは説明だ。

url と schedule は必須。schedule で定めた時刻や間隔で、url で示されるスクリプトが実行される。

timezone は省略可能。指定した timzone/タイムゾーン の時刻となる。timezone の指定がない場合は、UTC(GMT)となる。

上の例だと、毎日、日本時間の0時12分に /cron/daily にマップされたスクリプト
が実行される。

なお、リクエストに対するマッピングは、app.yaml で次のように記述しておく。

application: example
version: 1
runtime: python
api_version: 1

handlers:
- url: /cron.daily
  script: daily.py
  login: admin

「login: admin」という設定は、管理者のみにアクセスを制限するもの。この設定をしておかないと、「http://example.appspot.com/cron/daily」に外部からアクセスがあった場合に、設定したスケジュール外で「daily.py」が実行されてしまうことになる。

単なるランキングデータの取得なら影響はないが、データをリフレッシュしてしまうようなスクリプトの場合には、期待通りの結果が実現できなくなる。外部からのリフレッシュを期待する場合を除いて、「login: admin」の設定にしておいたほうがよい。

schedule の書式

schedule の定め方には、間隔指定と時刻指定がある。
間隔指定

  schedule: every N (hours|mins|minutes)

5分間隔なら "every 5 minutes"、半日間隔なら、"every 12 hours"

時刻指定

  schedule: ("every"|ordinal) (days) "of" (monthspec) (time)

具体的な時刻指定の例。

#3月の第2及び第3の月曜、水曜、木曜の 17:00
 2nd,third mon,wed,thu of march 17:00
#毎月曜の 09:00
 every monday of month 09:00
#9,10,11月の第1月曜の 17:00
 1st monday of sep,oct,nov 17:00

カンマ区切りで複数を指定できる。
(ordinal) 第何週か(first, または 1st など)。
(days) 曜日(manday, または mon など)。毎日は "every day" 。
(monthspec) 月(january, または jan など)。毎月は"month"。
(time) 24時間方式の「HH:MM」スタイル。