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
キューを使用する
- Redash では画面からのクエリ実行と定期実行のキューが別れていて、定期実行は
- 全クエリに対して上記の処理をする
- 再実行対象数と、再実行されたクエリIDのリスト、実行日時を Redis の
redash:status
にハッシュとして書き込む- Redash のステータスページでみられる項目の一部はこの情報を使っているはず(そこまでは追っていない)
まとめ
Redis を FLUSHALL
しても、定期実行が動き続ける理由が知れてよかった。