4JEFLJR &OUFSQSJTFΛಋೖͯ͠ϝʔϧ৴+0#Λվળͯ͠Έͨ[email protected]1
View Slide
2⾃⼰紹介
3⾃⼰紹介・川井⽥ 新介(かわいだ しんすけ)・3年前まで⿅児島で農業したりしてた⼈・趣味はサウナ・2019年1⽉メドピア⼊社・1⽉からRailsエンジニア
4今⽇のお話
5の前に
6Railsばっちこいな⼈
7Sidekiqさわったことある⼈
8Sidekiqとはqueue管理にRedisを使いマルチスレッドでメモリに優しいRubyの⾮同期処理フレームワーク
9有償版Pro・Enterprise
10Enterprise導⼊の理由
11信頼性の向上・reliable_push・super_fetch・expiring_jobs
12Reliable Push(pro)( ( )
13エンキュー! 500あいつどこ⾏った?普通のpush
14エンキュー!500Reliable Push隠し持ってたやつエンキュー!オッケー!
15Expiring Jobs(pro)期限切れ
16URL: https://github.com/mperham/sidekiq/wiki/Pro-Expiring-Jobs
17Super Fetch(pro)
18普通のfetchフェッチ① ② ③ ④② ③ ④
19Super Fetchフェッチ① ② ③ ④② ③ ④ ①バックアップ
20今⽇のお話
21Sidekiq Enterpriseを導⼊して、安⼼と信頼の定期実⾏メール配信処理を実現した話
22を
23Sidekiq Enterpriseの機能を紹介しながらしていきます
24なので
25こんな気持ち・Sidekiqの有償版きになるわぁ・メール配信の定期実⾏って多重配信とかどう管理してるのかしら・普段Ruby触らないけど他⾔語の⾮同期処理でも活かせるところあるかもで聞いていただけると嬉しいです。
26本題
27こんなJOBがありました
285分おきに実⾏1.配信待ちのメルマガを取得2.送信中に更新3.配信対象ユーザー分メール送信4.送信結果を保存5.送信完了に更新
29デプロイしたら死ぬ
30デプロイ時・キューのfetchを停⽌・8秒待ってプロセス終了・終わらなかったJOBはRedisに戻される
31再実⾏はされそう
325分おきに実⾏1.配信待ちのメルマガを取得2.送信中に更新3.配信対象ユーザー分メール送信4.送信結果を保存5.送信完了に更新
335分おきに実⾏1.配信待ちと送信中のメルマガを取得2.送信中に更新!ココ
345分おきに実⾏1.配信待ちと送信中のメルマガを取得2.送信中に更新!ココステータスは送信中のままなので、再実⾏時配信対象として取得されない
35送信中のメルマガもひろうようにする
365分おきに実⾏1.配信待ちと送信中!のメルマガを取得2.送信中に更新3.配信対象ユーザー分メール送信4.送信結果を保存5.送信完了に更新
37多重配信
385分おきに実⾏1.配信待ちと送信中のメルマガを取得!ココ送信JOB①送信JOB②メールADB送信中にするぜ送信中のも送信するぜ
39①ロックする多重配信対策
405分おきに実⾏1.配信待ちと送信中のメルマガを取得してロック2.送信中に更新3.配信対象ユーザー分メール送信4.送信結果を保存5.送信完了に更新
415分おきに実⾏1.配信待ちと送信中のメルマガを取得送信JOB①送信JOB②メールADBロックして送信中にするぜロックできない!!!
42そもそも実⾏時間が⻑すぎる
43②実⾏時間を短くするためJOBを分ける多重配信対策
44インポートJOBメール配信JOB
455分おきに実⾏1.配信待ちと送信中のメルマガを取得してロック2.送信中に更新3.配信対象ユーザーをインポート4.送信JOBをエンキューインポートJOB
461.メール送信2.送信結果を保存メール送信JOB
47インポートJOBメール配信JOBすべてのメール配信JOBが終了したらステータスを更新したい
48Batches(Pro)
49
50インポートJOB エンキューするJOB(Batches) メール配信JOB!
51インポートJOB エンキューするJOB(Batches) メール配信JOBリトライとかで多重実⾏されないようにしたい
52Unique Jobs(Ent)
53指定した時間内にクラス名、引数、キューが同じJOBを実⾏しないようにする
54なんとかなった
55学び・設計から並列性、冪等性を考慮した設計にしないとツライ
56Wiki のBest Practicesにも書いてあるurl: https://github.com/mperham/sidekiq/wiki/Best-Practices
57でも
58元々の問題
59デプロイしたら死ぬ
60Rolling Restart(Ent)
61URL: https://github.com/mperham/sidekiq/wiki/Ent-Rolling-Restarts
62※メモリに注意※新旧のコードに互換性が必要新プロセス⽴ち上げて旧プロセスのworkerの終了を待ってから、旧プロセスを終了する
63学び・設計から並列性、冪等性を考慮した設計にしないとツライ・Enterpriseだとなんとかしてくれる機能がある
64ご清聴ありがとうございました!