Slide 1

Slide 1 text

4JEFLJR8PSLFSઃܭͷίπ &CJTVSC.BTBUP/BLBNVSB !N@OBLBNVSB

Slide 2

Slide 2 text

ॲཧ݁Ռ͕௥͍΍͍͢Α͏ʹ ॲཧ͕ਖ਼͘͠ऴΘΔΑ͏ʹ

Slide 3

Slide 3 text

3FUSZΛઃఆ͢Δ 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 4

Slide 4 text

1 class RetryWorker 2 include Sidekiq::Worker 3 sidekiq_options queue: :default, retry: 3 4 5 def perform 6 puts "sample RetryWorker" 7 end 8 end 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 5

Slide 5 text

2VFVFΛ෼͚ͯ8FJHIUΛઃఆ͢Δ 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 6

Slide 6 text

1 --- 2 :concurrency: 5 3 staging: 4 :concurrency: 10 5 production: 6 :concurrency: 20 7 :queues: 8 - [reservation, 2] 9 - default 10 - low 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 7

Slide 7 text

8PSLFSͷॲཧ࣌ؒΛ୹͘͢Δ 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 8

Slide 8 text

1 require 'worker/base_worker' 2 3 class OpenRestaurantCsvWorker < BaseWorker 4 sidekiq_options queue: :default, retry: 3 5 6 # Bad Design 7 # 8 def perform 9 restaurants = Restaurant.open 10 restaurants.each do |restaurant| 11 restaurant.generate_csv 12 end 13 end 14 end 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 9

Slide 9 text

1 require 'worker/base_worker' 2 3 class OpenRestaurantCsvWorker < BaseWorker 4 sidekiq_options queue: :default, retry: 3 5 6 def self.dispatch 7 restaurant_ids = Restaurant.open.pluck(:id) 8 Sidekiq::Client.push_bulk( 9 'queue' => :default, 10 'class' => self, 11 'args' => restaurant_ids 12 ) 13 end 14 15 def perform(restaurant_id) 16 restaurant = Restaurant.find(restaurant_id) 17 restaurant.generate_csv 18 end 19 end 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 10

Slide 10 text

1 require 'worker/base_worker' 2 3 class DispatchOpenRestaurantCsvWorker < BaseWorker 4 sidekiq_options queue: :default, retry: 1 5 6 def perform 7 OpenRestaurantCsvWorker.dispatch 8 end 9 end 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 11

Slide 11 text

8PSLFS಺෦Ͱঢ়ଶΛ࣋ͨͳ͍ 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 12

Slide 12 text

1 require 'worker/base_worker' 2 3 class NotifyReservationStatusWorker < BaseWorker 4 sidekiq_options queue: :reservation, retry: 3 5 6 # Bad Design 7 # 8 def perform(reservation_id, status) 9 reservation = Reservation.find(reservation_id) 10 case status 11 when 'cancelled' 12 reservation.notify_cancelled 13 when 'visited' 14 reservation.notify_visited 15 end 16 end 17 end 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 13

Slide 13 text

1 require 'worker/base_worker' 2 3 class NotifyCancelledReservationWorker < BaseWorker 4 sidekiq_options queue: :reservation, retry: 3 5 6 def perform(reservation_id) 7 reservation = Reservation.find(reservation_id) 8 reservation.notify_cancelled 9 end 10 end 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 14

Slide 14 text

1 require 'worker/base_worker' 2 3 class NotifyVisitedReservationWorker < BaseWorker 4 sidekiq_options queue: :reservation, retry: 3 5 6 def perform(reservation_id) 7 reservation = Reservation.find(reservation_id) 8 reservation.notify_visited 9 end 10 end 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 15

Slide 15 text

%FBE࣌ͷॲཧΛڞ௨Խ͢Δ 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 16

Slide 16 text

1 class BaseWorker 2 include Sidekiq::Worker 3 sidekiq_retries_exhausted do |msg, exception| 4 Sidekiq.logger.fatal [self.class.name.underscore.to_sym, :retries_exhausted, msg] 5 Bugsnag.auto_notify(exception) 6 end 7 end 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 17

Slide 17 text

 3FUSZΛઃఆ͢Δ  2VFVFΛ෼͚ͯ8FJHIUΛઃఆ͢Δ  8PSLFSͷॲཧ࣌ؒΛ୹͘͢Δ  8PSLFS಺෦Ͱঢ়ଶΛ࣋ͨͳ͍  %FBE࣌ͷॲཧΛڞ௨Խ͢Δ 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π

Slide 18

Slide 18 text

IUUQTHJUIVCDPNNQFSIBNTJEFLJRXJLJ 4 J E F L J R  8 P S L F S ઃ ܭ ͷ ί π