SQLを自動で定期発行してBigQueryにテーブルを作成するアプリ[Google App Engine]


Google App EngineのTask Queueを使って、SQLを定期的に発行してBigQueryにテーブルを作成するサンプルアプリを作りました。

Task Queueとはなにか??

今回はPushキューを利用しています。説明は
GAE/Go TaskQueue その1~Pushキュー~
Go+GAE+Task QueueでCSVファイルを読み込んでCloudDatastoreに記録 その1
GAE Task Queue をマイクロサービスのサービス間通信として使う
などがわかりやすいです。簡単にまとめると

  • GAE専用の非同期通信の仕組み
  • あるURLに対して発行したいタスクをキューに積み、それをhttp通信で対象のURLに対して送信する
  • 送信はある程度の間隔で定期的に発行され、成功するまでリトライできる
  • PushキューはStandard Environmentのみ発行可能(PullキューはGAE以外でも使えるらしい)

といった感じです。今回はこのTask Queueのpushを使って、

  • Google Cloud StorageにSQLファイルと設定ファイルを設置するだけで
  • BigQueryに定期的にクエリを発行してテーブルを作成する

アプリを紹介します。

アプリの説明

アプリ自体はgithubにアップしましたが、大事な部分だけここで説明します。

アプリのコード抜粋

説明

ここで今回使うハンドラを定義します。 taskEnqueueHandlerが実際にタスクをキューに積むハンドラ、makeTableHandler が積まれたタスクを参考にしてキューを発行するハンドラになります。
makeTableHandlerについては前回記事のコードをだいたい使ってますので、taskEnqueueHandlerについて以下説明します。

まず、ここでSQLとその設定ファイルのyamlを読み込みます。今回の例だと、あるバケットにsampleというディレクトリをつくり、そこに設定ファイルを配置しています。
ここからファイルを読み込んで、SqlConfigという構造体に入れます。
次に、

ここで、実際に積むタスクを定義してからキューを積みます。タスクは100kbまで積めるようなので、SQLもそのまま入れちゃいました。
defaultとなっているのはキューの種類で、タスクをリトライする間隔などをカスタムすることもできます。今回はdefaultのキューを使いました。

cronの設定

次にスケジューリングをします。

これについても前回記事で説明した通りなので説明は省きます。
この設定で1日一回SQLが走るようになりました。

注意点

これで完成…の前にひとつ。このアプリをそのままデプロイすると、クローラーとかにURLを踏まれただけでtaskがキューにつまれ、BQにクエリが発行され、課金地獄になります。
それを避けるために管理者だけアクセスできるようにします。

のように、login: adminをつけることで権限があるユーザーだけURLがアクティブになります。 参考

完成!

いかがでしたでしょうか?普通に作るとなかなか大変そうな非同期でのデータマート作成システムですが、GAEを使うとかなり簡単に構成できた気がします。

えっGolangの書き方がイケてないと思ったらぜひPRお待ちしております!

シェアする

  • このエントリーをはてなブックマークに追加

フォローする