$30 off During Our Annual Pro Sale. View Details »

Redisでバッチ処理を冗長化しつつ排他制御

ryonext
September 17, 2014

 Redisでバッチ処理を冗長化しつつ排他制御

ryonext

September 17, 2014
Tweet

More Decks by ryonext

Other Decks in Programming

Transcript

  1. 3FEJTͰόονॲཧΛ
    ৑௕Խͭͭ͠ഉଞ੍ޚ

    View Slide

  2. ࣗݾ঺հ

    View Slide

  3. ͜͏͍͏ύλʔϯ
    ͓Εͷ3BJMT"QQ ֎෦ͷ"1*
    6TFS

    View Slide

  4. ຖճ"1*ϦΫΤετ͢Δͱ
    w Ԡ౴଎౓తʹͭΒ͍
    w "1*αʔόʹෛՙ͕͔͔Δ

    View Slide

  5. ͜͏͍͏෩ʹ͢Δ
    ͓Εͷ3BJMT"QQ ֎෦ͷ"1*
    6TFS
    ϢʔβʔϦΫΤετ όονॲཧ

    View Slide

  6. 3BJMTͳΒ
    w XIFOFWFSDBQJTUSBOPͰBQQαʔόʹσϓϩ
    ΠͷλΠϛϯάͰDSPO࡞੒Ͱ͖ͯ௒ḿΔ

    View Slide

  7. 㵺㱿㵺
    ɻP ଴ͯΑʁ"QQαʔόͬͯ৑௕Խ͞ΕͯΔΑͳʁ

    View Slide

  8. c"QQ "QQcᵎ ☋ʆ
    ᵊࡾ

    View Slide

  9. ◠㷩◠
    ☛Ͳͬͪʹ΋ొ࿥͓͍ͯͨ͠Αʔ
    # Begin Whenever generated tasks for: oreno_app
    PATH=/var/www/oreno_app/shared/bundle/ruby/2.1.0/bin:/usr/local/rbenv/
    versions/2.1.2/bin:/usr/local/rbenv/libexec:/usr/local/sbin:/usr/local/
    bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
    !
    0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash -l -c 'cd /var/www/
    oreno_app/releases/20140917060508 && RAILS_ENV=production bundle exec rake
    kankore:ensei --silent >> log/crontab.log 2>&1'
    !
    # End Whenever generated tasks for: oreno_app

    View Slide

  10. ‧‪‬‭▓▒░ `Т`
    ░▒▓‭‬‪‧͏Θ͋͋͋͋͋͋

    View Slide

  11. ՕॴͰ૸Δͱ
    w ࢿݯͷແବݣ͍ײ
    w Կ͔ΛΠϯΫϦϝϯτ͢ΔͳͲɺͭ૸ͬͨΒக
    ໋తͳॲཧͩͱࢮ͵

    View Slide

  12. ͜ΕͰղܾʂʁ
    ͓Εͷ3BJMT"QQ ͓Εͷ3BJMT"QQ
    όον࣮ߦαʔό

    View Slide

  13. ͍͕ͭ͜མͪͨΒࢮ͵
    όον࣮ߦαʔό
    ʀŋAТŋ

    View Slide

  14. ͦ͜Ͱ3FEJT
    task nanika: :environment do
    sleep(rand(5)) # 実行時間をずらす
    redis = Redis.new
    unless redis.get(‘task_executed')
    redis.setex('task_executed', 300, Time.now)
    # やりたいタスクを書く
    end
    end

    View Slide

  15. ͜͏͢Δ͜ͱͰ
    w ઌʹಈ͍ͨํ͸3FEJTʹΩʔ͕ͳ͚Ε͹ΩʔΛ
    ࡞ͬͯλεΫ࣮ߦ
    w Ωʔ͕͋ͬͨΒଈ࠲ʹ΍ΊΔ
    w Ωʔ͸Ұఆ࣌ؒͰʢ࣍ͷDSPO࣮ߦ·Ͱʹʣফ͑
    Δ
    w ͭ·Γɺ৑௕Խͭͭ͠ഉଞ੍ޚͰ͖Δ

    View Slide

  16. ͱ͍͏͜ͱΛ΍ͬͯ͘ΕΔ(FN
    ͕͋Γ·ͨ͠
    w IUUQTHJUIVCDPNLFOOSFEJTNVUFY

    View Slide

  17. ͜͏͍͏ײ͡Ͱॻ͚·͢
    Redis::Classy.db = Redis.new()
    mutex = Redis::Mutex.new('lock_access', expire: 180)
    begin
    mutex.lock!
    # やりたい処理を書く
    rescue Redis::Mutex::LockError
    puts 'locked'
    end

    View Slide

  18. ͓͠·͍

    View Slide