Slide 1

Slide 1 text

なんかスケジューラー 使う奴作ってその話 Shinjuku.rb #43 @takeyuweb

Slide 2

Slide 2 text

@takeyuweb • VAIOスキー • 高専卒 • 元フリー→法人成り • 大宮在住 • 32歳既婚一児の父 • 最近のマイブームは Tree of Savior (MMORPG)

Slide 3

Slide 3 text

スケジューラーの話

Slide 4

Slide 4 text

crond • 定番 • Unix系OSでジョブ(コマンド)スケジューリングするやつ • バッチ処理など • whenever gem • Ruby DSLでスケジュールを書く • デプロイ先でコマンド実行するスケジュール書き換え

Slide 5

Slide 5 text

crond: whenever job_type :runner, "cd :path && bundle exec ruby bin/rails runner -e :environment ':task' :output" every 5.minutes do runner 'Video.schedule_activation_all' runner 'Video.expire_grace_all' runner 'Content::Recommendation::Popularity.randomize_all' runner 'Content::List::List.schedule_activation!' runner 'Content::List::List.schedule_expiration!' end every '0 2 20 * *' do runner "Video.create_sale_list(Time.current)" end

Slide 6

Slide 6 text

crond: pros and cons pros • 基本的なコマンド • 導入が簡単 • 学習コスト小さい • 手軽 cons • 冗長化めんどい • 1台のバッチ処理用サーバに • 単一障害点 • 負荷が集中

Slide 7

Slide 7 text

クラウド時代の定期処理

Slide 8

Slide 8 text

2015/10/08

Slide 9

Slide 9 text

2016/01/15

Slide 10

Slide 10 text

CloudWatch Eventsの利用 スケジュールベースに 一定間隔でクーロンのような形での イベント作成も可能です。

Slide 11

Slide 11 text

CloudWatch Eventsの利用 幾つかのターゲットに対し ファンクションと取ることが可能になります。 (AWS Lambda、Amazon Kinesis Stream、Amazon SNS, Bullet-in ターゲット連携することができます)。

Slide 12

Slide 12 text

これ使えそう!たとえば… 1. 定期的にLambdaファンク ション起動 2. Lambdaファンクションか らSQSにジョブ登録 3. ワーカー(1台以上)でジョ ブを取り出す 4. 実行 AWS Lambda ... イベント発生時にアップロードしたコード(JavaScriptなど)を AWS内で実行してくれるやつ AWS SQS ... フルマネージドのメッセージキュー。

Slide 13

Slide 13 text

2016/03/30

Slide 14

Slide 14 text

Lambdaすら不要になった! 1. 定期的にSQSにジョブ登録 2. ワーカー(1台以上)でジョブを取り出す 3. 実行

Slide 15

Slide 15 text

Rubyで Amazon CloudWatch Events 定期ジョブを書けるやつ作った話 ここまで前フリ!

Slide 16

Slide 16 text

スケジュールを書く rate '5 minutes' do Video.schedule_activation_all Video.expire_grace_all Content::Recommendation::Popularity.randomize_all Content::List::List.schedule_activation! Content::List::List.schedule_expiration! end cron '0 0 27 * ? *', as: :create_sale_list do Video.create_sale_list(Time.zone.now) end

Slide 17

Slide 17 text

コマンドを実行する $ bundle exec kyklos -c config/schedule.rb ¥ > --adapter shoryuken ¥ > --adapter_args=[queue_url] ¥ > --identifier=nanairo_production

Slide 18

Slide 18 text

ワーカーの設定を書く require ‘kyklos’ Kyklos::Adapters::ShoryukenAdapter::Worker.config_path = ‘config/schedule.rb’ Shoryuken.register_worker ‘kyklos’, Kyklos::Adapters::ShoryukenAdapter::Worker concurrency: 50 delay: 10 queues: - [default, 4] - [kyklos, 1]

Slide 19

Slide 19 text

ワーカーを起動する $ bundle exec shoryuken ¥ > -r ./kyklos_worker.rb ¥ > -C config/shoryuken.yml これでRubyで書いたスケジュールに基づいて、 1.定期実行ジョブが登録され 2.ジョブに対応するRubyコードが実行されます。 shoryuken ... AWS SQSをバックエンドに使っている、非同期処理用のgem

Slide 20

Slide 20 text

何が起きたか?(1) • kyklosコマンド 1. Ruby DSL→定期実行ルールリストを組み立て 2. AWS SDKで登録 1. CloudWatchEventsに組み立てたルールとスケジュールを登録 2. SQSキューにpushできるようにポリシードキュメント編集

Slide 21

Slide 21 text

何が起きたか?(2) • CloudWatch Events 1. 指定日時にAWS SQSにメッセージを追加 • メッセージに実行すべきジョブの識別子を含む

Slide 22

Slide 22 text

何が起きたか?(3) • shoryukenコマンド 1. CloudWatchEventsによって登録されたメッセージを受信 2. Kyklos::Adapters::ShoryukenAdapter::Worker 1. Ruby DSL→定期実行ルールリストを組み立て 2. SQSメッセージの内容から実行すべきルールを選択 3. 実行

Slide 23

Slide 23 text

gemにした • kyklos: キクロス • 「周期」とかのギリシア語 • lambda = λ : ギリシア文字 • はじめlambdaでSQS登録するやつ 作ろうと思ってたから。 • ただし1日ででっちあげたや つなので課題はいろいろある • ロールまわり • APIエラーハンドリング • 実行結果の取得と再実行など • shoryuken以外のアダプタ • そのほか運用に耐えうる機能

Slide 24

Slide 24 text

Amazon SQSの問題 • メッセージ(ジョブ)は少なくとも1回 • 必ず1回は配信される(at-least-once) • 2回以上配信される場合がある • 繰り返し実行されても同じ結果になるように 注意して設計する必要がある(冪等性) • 順番を保証しない • キュー内に複数のメッセージがあるとき、 到着順が前後することがある • 順番に依存する設計はまずい • (でもこれはCRONでもそう。普通時間を空けるとかしますよね) https://speakerdeck.com/takeyuweb/rails-on-awsdefalsefei-tong-qi

Slide 25

Slide 25 text

2016/11/17 殺伐としたSQSに救世主が!! • FIFO • 先入れ先出し First-In First-Out • 順番が保証される! • Exactly-Once Processing • 1つのメッセージは1回しか実行 されない • Deduplication • 誤って多重登録されることを自 動で防ぐ • 5分以内に同じ内容のメッセー ジがあったら無視 ※ただし東京リージョンはまだ。

Slide 26

Slide 26 text

開発パートナー/社員募集 • Ruby on Rails Webアプリケーションや、PowerCMSによる CMSなど、弊社受注案件を一緒に開発してくれるフリーランス 開発者を探しています。 • 完全リモート可 • 条件交渉可 • 最低稼働時間の取り決め無し可 • 会社勤めしたくなくて引きこもりフリー開発者だった僕でも 「働いてもよいかも」と思える会社にする方法を考え中です。 • 完全リモート可 • 自由研究制度 • カンファレンス参加費が経費で出る 予定 タケユー・ウェブ株式会社 https://takeyuweb.co.jp/