Redash のクエリ定期実行はどのように実現されているのか

内容は本記事を書いた2018/06/03時点の理解なので、間違っていたら直す。

対象のバージョン

Redash 4.0.1 c86423a で確認した。

ざっくり言うと

30秒ごとにクエリの最終取得日時と定期実行の設定を比較し、再実行が必要なものを scheuled_queries キューで実行する。

クエリ定期実行の流れ

  • 30秒に1度、redash.tasks.queries.refresh_queries が実行される
    • celery beat を使って定期実行されている
    • デフォルトでは定期実行の最小値が毎時1分になっているのは、celery beat が30秒に1度動くためかもしれない
      • 「30秒」というところは今のところベタ書きされている
  • 各クエリの retrieved_at や、そのクエリのスケジュール実行設定をみて、再実行が必要かどうかを判断する
    • FEATURE_DISABLE_REFRESH_QUERIES が有効になっているとスケジュール実行はすべて無視される
  • クエリパラメータを使用している場合は、 queries テーブルに保存されているデフォルトのパラメータをクエリにバインドする。クエリパラメータを使用していない場合クエリ文字列を取得する
  • キューにタスクを追加する
    • Redash では画面からのクエリ実行と定期実行のキューが別れていて、定期実行は scheuled_queries キューを使用する
  • 全クエリに対して上記の処理をする
  • 再実行対象数と、再実行されたクエリIDのリスト、実行日時を Redis の redash:status にハッシュとして書き込む
    • Redash のステータスページでみられる項目の一部はこの情報を使っているはず(そこまでは追っていない)

まとめ

Redis を FLUSHALL しても、定期実行が動き続ける理由が知れてよかった。