Upgrade to Pro — share decks privately, control downloads, hide ads and more …

デプロイで止まらないバッチ処理を求めて

 デプロイで止まらないバッチ処理を求めて

Heroku Meetup #27 で『デプロイで止まらないバッチ処理を求めて』という話をしてきた #herokujp
https://developer.feedforce.jp/entry/2019/12/14/153000

Takashi Masuda

December 13, 2019
Tweet

More Decks by Takashi Masuda

Other Decks in Programming

Transcript

  1. Heroku Meetup登壇履歴
 • Heroku Meetup #23 "Heroku Dynamite!!"
 ◦ 『先々週

    GA になった heroku.yml を使った Docker Deploy の紹介』 
 • Heroku Meetup #25 "Heroku Ghost"
 ◦ 『デプロイ元をCircleCIからHerokuに乗り換えた話。ヒヤリもあるよ』 
 • Heroku Meetup #27 "Heroku Vitamin!" ← 今日!
 ◦ 『デプロイで止まらないバッチ処理を求めて』 
 https://speakerdeck.com/masutaka 

  2. EC Boosterの技術スタック
 Heroku App Web Dyno GraphQL Client (apollo-client) GraphQL

    Server (graphql-ruby on Rails) Worker Dyno Chrome (headless mode) chromedriver sidekiq Heroku Postgres Heroku Redis
  3. いつ再起動されるか?
 • デプロイした時
 • config vars(環境変数)を変更した時
 • Add-onを変更した時
 • 手動再起動($

    heroku ps:restart)した時
 • 以上が24時間(+ ランダムで216分)行われなかったら
 ◦ Cyclingと呼ばれる
 • その他、必要に応じて
 https://devcenter.heroku.com/articles/dynos#restarting 

  4. Heroku App Web Dyno GraphQL Client (apollo-client) GraphQL Server (graphql-ruby

    on Rails) Worker Dyno Chrome (headless mode) chromedriver sidekiq Heroku Postgres Heroku Redis
  5. Heroku Platform APIを使って、One-Off Dynoを作成
 Heroku App Worker Dyno sidekiq One-Off

    Dyno Rails runner 作成 https://devcenter.heroku.com/articles/platform-api-reference 
 • One-Off Dyno上でバッチ処理を行うRails runnerが起動される 
 • バッチ処理が終わると、One-Off Dynoは終了&破棄される 

  6. Rubyでの実装例(platform-api gemを利用)
 dyno = ::PlatformAPI::Dyno.new( ::PlatformAPI.connect('{{Heroku API Key}}'), ) dyno.create(

    '{{Heroku App Name}}', attach: false, # (1) command: %!rails r "SampleCoreJob.perform_now(shop_id: '#{shop.id}', global_executions: #{global_executions})"!, force_no_tty: nil, # (2) size: 'performance-m', type: 'run', time_to_live: 1.hour, ) # (1) false: 標準出力/標準エラー出力をアプリログに流す # (2) "attach: true" の時に意味があるようだ https://rubygems.org/gems/platform-api 

  7. 良かったこと
 • Dynoの寿命を自分でコントロール出来た
 ◦ 最大24時間。もちろん勝手に再起動しない 
 • 同時実行数はあまり気にしなくて良かった
 ◦ Heroku

    App単位で100 Dynoまで同時起動できるとのこと。増やすことも可能らしい 
 • 強いDynoを使っても、ほとんど料金が増えなかった
 ◦ 2019/11は$1.60
 ◦ もちろんバッチ処理の起動時間によります 

  8. 専用のリトライメソッドを作成した
 • 今まではActive Jobのretry_on等で自身をリトライすればよかった
 • そのままの実装だと、One-Shot Dynoではなくworker Dyno上でリトライ されてしまう
 •

    自身ではなく、自身をキックするジョブをリトライする必要がある
 • 今回はretry_onを改造したretry_oneshot_onというメソッドを作った