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

sidekiq_enterprise20190828

 sidekiq_enterprise20190828

Shinsuke Kawaida

August 28, 2019
Tweet

More Decks by Shinsuke Kawaida

Other Decks in Technology

Transcript

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

    [email protected]
    1

    View Slide

  2. 2
    ⾃⼰紹介

    View Slide

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

    View Slide

  4. 4
    今⽇のお話

    View Slide

  5. 5
    の前に

    View Slide

  6. 6
    Rails
    ばっちこいな⼈

    View Slide

  7. 7
    Sidekiq
    さわったことある⼈

    View Slide

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

    View Slide

  9. 9
    有償版Pro・Enterprise

    View Slide

  10. 10
    Enterprise
    導⼊の理由

    View Slide

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

    View Slide

  12. 12
    Reliable Push(pro)

    ( ( )

    View Slide

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

    View Slide

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

    View Slide

  15. 15
    Expiring Jobs(pro)




    View Slide

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

    View Slide

  17. 17
    Super Fetch(pro)

    View Slide

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

    View Slide

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

    View Slide

  20. 20
    今⽇のお話

    View Slide

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

    View Slide

  22. 22

    View Slide

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

    View Slide

  24. 24
    なので

    View Slide

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

    View Slide

  26. 26
    本題

    View Slide

  27. 27
    こんなJOBが
    ありました

    View Slide

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

    View Slide

  29. 29
    デプロイしたら死ぬ

    View Slide

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

    View Slide

  31. 31
    再実⾏はされそう

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  37. 37
    多重配信

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  48. 48
    Batches(Pro)

    View Slide

  49. 49

    View Slide

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

    View Slide

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

    View Slide

  52. 52
    Unique Jobs(Ent)

    View Slide

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

    View Slide

  54. 54
    なんとかなった

    View Slide

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

    View Slide

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

    View Slide

  57. 57
    でも

    View Slide

  58. 58
    元々の問題

    View Slide

  59. 59
    デプロイしたら死ぬ

    View Slide

  60. 60
    Rolling Restart(Ent)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide