Slide 1

Slide 1 text

4JEFLJR &OUFSQSJTFΛ ಋೖͯ͠ϝʔϧ഑৴+0#Λ վળͯ͠Έͨ࿩ !UBNBNVTIJ@ 1

Slide 2

Slide 2 text

2 ⾃⼰紹介

Slide 3

Slide 3 text

3 ⾃⼰紹介 ・川井⽥ 新介(かわいだ しんすけ) ・3年前まで⿅児島で農業したりしてた⼈ ・趣味はサウナ ・2019年1⽉メドピア⼊社 ・1⽉からRailsエンジニア

Slide 4

Slide 4 text

4 今⽇のお話

Slide 5

Slide 5 text

5 の前に

Slide 6

Slide 6 text

6 Rails ばっちこいな⼈

Slide 7

Slide 7 text

7 Sidekiq さわったことある⼈

Slide 8

Slide 8 text

8 Sidekiqとは queue管理にRedisを使い マルチスレッドでメモリに優しい Rubyの⾮同期処理 フレームワーク

Slide 9

Slide 9 text

9 有償版Pro・Enterprise

Slide 10

Slide 10 text

10 Enterprise 導⼊の理由

Slide 11

Slide 11 text

11 信頼性の向上 ・reliable_push ・super_fetch ・expiring_jobs

Slide 12

Slide 12 text

12 Reliable Push(pro) ( ( )

Slide 13

Slide 13 text

13 エンキュー! 500 あいつどこ⾏った? 普通のpush

Slide 14

Slide 14 text

14 エンキュー! 500 Reliable Push 隠し持ってたやつ エンキュー! オッケー!

Slide 15

Slide 15 text

15 Expiring Jobs(pro) 期 限 切 れ

Slide 16

Slide 16 text

16 URL: https://github.com/mperham/sidekiq/wiki/Pro-Expiring-Jobs

Slide 17

Slide 17 text

17 Super Fetch(pro)

Slide 18

Slide 18 text

18 普通のfetch フェッチ ① ② ③ ④ ② ③ ④

Slide 19

Slide 19 text

19 Super Fetch フェッチ ① ② ③ ④ ② ③ ④ ① バックアップ

Slide 20

Slide 20 text

20 今⽇のお話

Slide 21

Slide 21 text

21 Sidekiq Enterpriseを導⼊して、 安⼼と信頼の定期実⾏ メール配信処理を実現した話

Slide 22

Slide 22 text

22 を

Slide 23

Slide 23 text

23 Sidekiq Enterpriseの 機能を紹介しながら していきます

Slide 24

Slide 24 text

24 なので

Slide 25

Slide 25 text

25 こんな気持ち ・Sidekiqの有償版きになるわぁ ・メール配信の定期実⾏って多重配信とかどう管 理してるのかしら ・普段Ruby触らないけど他⾔語の⾮同期処理でも 活かせるところあるかも で聞いていただけると嬉しいです。

Slide 26

Slide 26 text

26 本題

Slide 27

Slide 27 text

27 こんなJOBが ありました

Slide 28

Slide 28 text

28 5分おきに実⾏ 1.配信待ちのメルマガを取得 2.送信中に更新 3.配信対象ユーザー分メール送信 4.送信結果を保存 5.送信完了に更新

Slide 29

Slide 29 text

29 デプロイしたら死ぬ

Slide 30

Slide 30 text

30 デプロイ時 ・キューのfetchを停⽌ ・8秒待ってプロセス終了 ・終わらなかったJOBは Redisに戻される

Slide 31

Slide 31 text

31 再実⾏はされそう

Slide 32

Slide 32 text

32 5分おきに実⾏ 1.配信待ちのメルマガを取得 2.送信中に更新 3.配信対象ユーザー分メール送信 4.送信結果を保存 5.送信完了に更新

Slide 33

Slide 33 text

33 5分おきに実⾏ 1.配信待ちと送信中のメルマガを取得 2.送信中に更新!ココ

Slide 34

Slide 34 text

34 5分おきに実⾏ 1.配信待ちと送信中のメルマガを取得 2.送信中に更新!ココ ステータスは送信中のままなので、 再実⾏時配信対象として取得されない

Slide 35

Slide 35 text

35 送信中のメルマガも ひろうようにする

Slide 36

Slide 36 text

36 5分おきに実⾏ 1.配信待ちと送信中!のメルマガを取得 2.送信中に更新 3.配信対象ユーザー分メール送信 4.送信結果を保存 5.送信完了に更新

Slide 37

Slide 37 text

37 多重配信

Slide 38

Slide 38 text

38 5分おきに実⾏ 1.配信待ちと送信中のメルマガを取得 !ココ 送信JOB① 送信JOB② メールA DB 送信中にするぜ 送信中のも送信するぜ

Slide 39

Slide 39 text

39 ①ロックする 多重配信対策

Slide 40

Slide 40 text

40 5分おきに実⾏ 1.配信待ちと送信中のメルマガを取得してロック 2.送信中に更新 3.配信対象ユーザー分メール送信 4.送信結果を保存 5.送信完了に更新

Slide 41

Slide 41 text

41 5分おきに実⾏ 1.配信待ちと送信中のメルマガを取得 送信JOB① 送信JOB② メールA DB ロックして 送信中にするぜ ロックできない!!!

Slide 42

Slide 42 text

42 そもそも実⾏時間 が⻑すぎる

Slide 43

Slide 43 text

43 ②実⾏時間を短くする ためJOBを分ける 多重配信対策

Slide 44

Slide 44 text

44 インポートJOB メール配信JOB

Slide 45

Slide 45 text

45 5分おきに実⾏ 1.配信待ちと送信中のメルマガを取得してロック 2.送信中に更新 3.配信対象ユーザーをインポート 4.送信JOBをエンキュー インポートJOB

Slide 46

Slide 46 text

46 1.メール送信 2.送信結果を保存 メール送信JOB

Slide 47

Slide 47 text

47 インポートJOB メール配信JOB すべてのメール配信JOBが終了したら ステータスを更新したい

Slide 48

Slide 48 text

48 Batches(Pro)

Slide 49

Slide 49 text

49

Slide 50

Slide 50 text

50 インポートJOB エンキューするJOB(Batches) メール配信JOB !

Slide 51

Slide 51 text

51 インポートJOB エンキューするJOB(Batches) メール配信JOB リトライとかで 多重実⾏されないようにしたい

Slide 52

Slide 52 text

52 Unique Jobs(Ent)

Slide 53

Slide 53 text

53 指定した時間内に クラス名、引数、キューが 同じJOBを実⾏しないようにする

Slide 54

Slide 54 text

54 なんとかなった

Slide 55

Slide 55 text

55 学び ・設計から並列性、冪等性を 考慮した設計にしないとツライ

Slide 56

Slide 56 text

56 Wiki のBest Practicesにも 書いてある url: https://github.com/mperham/sidekiq/wiki/Best-Practices

Slide 57

Slide 57 text

57 でも

Slide 58

Slide 58 text

58 元々の問題

Slide 59

Slide 59 text

59 デプロイしたら死ぬ

Slide 60

Slide 60 text

60 Rolling Restart(Ent)

Slide 61

Slide 61 text

61 URL: https://github.com/mperham/sidekiq/wiki/Ent-Rolling-Restarts

Slide 62

Slide 62 text

62 ※メモリに注意 ※新旧のコードに互換性が必要 新プロセス⽴ち上げて 旧プロセスのworkerの終了を 待ってから、旧プロセスを終了する

Slide 63

Slide 63 text

63 学び ・設計から並列性、冪等性を 考慮した設計にしないとツライ ・Enterpriseだとなんとか してくれる機能がある

Slide 64

Slide 64 text

64 ご清聴ありがとうございました!