ゆっくり動くと速く動ける / If you move slowly, you can move more fast
by
shigeru. nakajima
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Ώͬ͘Γಈ͘ͱ͘ಈ͚Δ Rails Developers Meetup 2018 Day 4 Nouvelle Vague 2018/12/08 גࣜձࣾϥάβΠΞ தౡ ࣎
Slide 2
Slide 2 text
RailsΞϓϦέʔγϣϯͷ ΞʔΩςΫνϟબͷ
Slide 3
Slide 3 text
ΞʔΩςΫνϟ ΞϓϦέʔγϣϯʹґଘ ࠷ॳʹରͷΞϓϦέʔγϣϯͷઆ໌Λ͠·͢
Slide 4
Slide 4 text
LODQA BS Web e-mail LODQA BS DB DB DB ϑϩϯτΤϯυαʔόʔ όοΫΤϯυDB ݕࡧΤϯδϯ
Slide 5
Slide 5 text
LODQA BSͷಛ ϑϩϯτΤϯυαʔόʔ ෳ όοΫΤϯυDB ෳ ݕࡧ࣌ؒ ඵʙ10
Slide 6
Slide 6 text
ԿΛݕࡧ͢Δͷ͔ʁ Ҩࢠใ όΠΦϒʔϜͷͱ͖ʹɺͨ͘͞Μղੳ͞Εͨ ۲͠ݕࡧ͢ΔͨΊϦϯΫυσʔλͱͯ͠ެ։
Slide 7
Slide 7 text
ϦϯΫυσʔλ άϥϑཧͷάϥϑ ओޠ - ड़ޠ - తޠ ཁૉΛͨͲͬͯݕࡧͰ͖Δ SPARQLͱSPARQLΤϯυϙΠϯτ
Slide 8
Slide 8 text
൚༻త ͍͜ͳ͢ͷ͕͍͠
Slide 9
Slide 9 text
͏ਓ ੜ໋Պֶͷݚڀऀ ܭࢉػՊֶSPARQLͷઐՈͰͳ͍ ྫ͑ΔͳΒ อݥΛઃܭ͢Δਓ͕ɺੜSQLΛ͍͜ͳͯ͠ ࣄނΛࢉग़
Slide 10
Slide 10 text
ࣗવݴޠͰݕࡧ͍ͨ͠
Slide 11
Slide 11 text
ӳจߏจղੳͰ͖Δ Which genes are associated with Endothelin receptor type B? genes Endothelin receptor type B associated with ߋʹURIʹม
Slide 12
Slide 12 text
SPARQLΛੜ SELECT ?it1 ?st1 ?p01 WHERE { ?it1 ?st1 . ?p01 ?it1 . FILTER (isIRI(?it1)) FILTER (?p01 NOT IN (, , , , , )) FILTER (?st1 IN (, , , , , )) } LIMIT 10 100ʙ1000ݸੜ͞ΕΔ
Slide 13
Slide 13 text
ݕࡧۭؒ SPARQLάϥϑΛͨͲΔ ࢦؔతʹݕࡧۭ͕ؒ૿͑Δ 100 x 100 x 100 … ສʙ10ԯϨίʔυˏone DB ओޠ- ड़ޠ ->తޠ = = GraphQLʹͪΐͬͱࣅ͍ͯΔ ओޠ- ड़ޠ ->తޠ ओޠ- ड़ޠ ->తޠ
Slide 14
Slide 14 text
ݕࡧ࣌ؒྫ Which genes are associated with Endothelin receptor type B? => 40 ඵ What drugs are associated with strokes and arthrosis? => 1030ඵ
Slide 15
Slide 15 text
ΞϓϦέʔγϣϯͷ༷આ໌ऴΘΓ ͔͜͜ΒΞʔΩςΫνϟͷ
Slide 16
Slide 16 text
ΞϓϦέʔγϣϯͷಛ HTTPϦΫΤετͷmsʙඵ ݕࡧඵʙ ॲཧ࣌ؒͷΦʔμʔ͕ҧ͏
Slide 17
Slide 17 text
Active Job Railsඪ४ ඇಉظॲཧΠϯλϑΣʔε δϣϒͷ࣮ߦόοΫΤϯυ͕બՄೳ delayed_job, sidekiq ActiveRecordͱDBͷؔ
Slide 18
Slide 18 text
γʔέϯε ϑϩϯτΤϯυ ίϯτϩʔϥʔ DB ݕࡧδϣϒ HTTP ݕࡧใ Ϩεϙϯε ݕࡧ݁Ռ ݕࡧ݁ՌʢΩϟογϡʣ ݕࡧʢेඵʣ ʢेmsʣ
Slide 19
Slide 19 text
ϛυϧΣΞͷબ DB SQLite3 ActiveJob::QueueAdapter AsyncAdapter
Slide 20
Slide 20 text
Why SQLIite3 ϘτϧωοΫόοΫΤϯυDB εέʔϧΞτ͠ͳ͍ ΞϓϦͱDBͷϓϩηεΛ͚Δඞཁ͕ͳ͍
Slide 21
Slide 21 text
Why AsyncAdapter δϣϒͷӬଓԽ͕ෆཁ ݕࡧ్தͰΞϓϦέʔγϣϯΛ࠶ىಈͯ͠ɺ ݕࡧΛϦτϥΠ͠ͳ͍ σϑΥϧτͷRailsඇಉظΩϡʔΛ࣮͠·͢ɻ͜ΕɺΠϯ ϓϩηεͷεϨουϓʔϧͰδϣϒΛ࣮ߦ͠·͢ɻδϣϒඇಉ ظʹ࣮ߦ͞Ε·͕͢ɺ࠶ىಈ͢Δͱͯ͢ͷδϣϒࣦΘΕ·͢ɻ https://railsguides.jp/active_job_basics.html AsynAdapterΩϡʔ͕Ұͭͱ͍͏ಛ͋Δ
Slide 22
Slide 22 text
ϝϦοτ 1ΞϓϦέʔγϣϯ1ϓϩηε ։ൃڥɺӡ༻ڥͷߏஙָ͕
Slide 23
Slide 23 text
docker-compose ϦϙδτϦ͕ࢦఆͰ͖Δ ϞϊϨϙ͍Βͳ͍ version: '3' services: lodqa_bs: build: https://github.com/lodqa/lodqa_bs.git lodqa_email_agent: build: . depends_on: - lodqa_bs
Slide 24
Slide 24 text
Dockerfileͷίπ entory-point Ͱ db:migrate ͢Δ ιʔείʔυɾϑΝΠϧΛίϯςφʹίϐʔ͢Δ #!/bin/sh set -e if [ $1 = 'bin/rails' ] && [ $2 = 's' ] ; then rm -f ./tmp/pids/server.pid bin/rails db:migrate fi exec "$@" RUN mkdir -p /usr/src/myapp WORKDIR /usr/src/myapp COPY . ./
Slide 25
Slide 25 text
͜͜·Ͱޫͷ ͔͜͜Βҋͷ
Slide 26
Slide 26 text
Rail Wayͷͬ͜ SQLLite3Λ͍ͬͯΔਓʁ AsyncAdapterΛ͍ͬͯΔਓʁ ݟ͕গͳ͍ ͬ͜ײΛ͠·͢
Slide 27
Slide 27 text
SQLite3ͷҙ ಉ࣌ʹॻ͖ࠐΊͳ͍ ಡΈࠐΈOK SQLite3::BusyException ্͕͕ͬͯ͘Δ ActiveRecordέΞ͠ͳ͍ ΞϓϦέʔγϣϯͰέΞ͢ΔͱActiveRecordͷந͕ഁΕΔ
Slide 28
Slide 28 text
SQLite3Λ͏ίπ DBίωΫγϣϯͷ্ݶΛ1ʹ͢Δ λΠϜΞτγϏΞʹͳΔ default: &default adapter: sqlite3 pool: 1 timeout: 5000 config/database.yml
Slide 29
Slide 29 text
AsyncAdapterͷҙ ඇಉظॲཧΛεϨουϓʔϧͰ࣮ݱ developmentڥͷΫϥε୳ࡧͰΤϥʔ͕ى͖Δ ॥ࢀরݕग़ػೳ͕εϨουΞϯηʔϑ https://github.com/rails/rails/issues/18725#issuecomment-72091474 2015͔Βط config.eager_load = true config/environments/development.rb
Slide 30
Slide 30 text
DBίωΫγϣϯͷղ์ ActiveRecordͷDBίωΫγϣϯΛऔಘɾղ์ͨ͜͠ ͱ͕͋Δਓʁ ͳ͔ͥࣗಈతʹߦΘΕ͍ͯΔ
Slide 31
Slide 31 text
ActiveRecordͷ DBίωΫγϣϯղ์ઓུ DBίωΫγϣϯʹɺ࣋ͪओͷεϨουΛͨͤΔ εϨου͕ऴ͍ྃͯͨ͠ΒɺDBίωΫγϣϯΛ࠶ར༻ WebΞϓϦέʔγϣϯHTTPϦΫΤετຖʹεϨουΛ࡞Δ ϨεϙϯεΛฦͨ͠ΒεϨουऴྃ͢Δ WebΞϓϦέʔγϣϯϨεϙϯεฦͨ͠ΒDBΛૢ࡞͠ͳ͍
Slide 32
Slide 32 text
AsyncAdapterͷҙ ඇಉظॲཧΛεϨουϓʔϧͰ࣮ݱ εϨουऴΘΒͳ͍ ϓʔϧʹͬͯ࠶ར༻͞ΕΔ DBίωΫγϣϯղ์͞Εͳ͍
Slide 33
Slide 33 text
AsyncAdapterΛ͏ίπ DBΛखಈͰղ์͢Δ https://github.com/brandonhilkert/ sucker_punch#activerecord-connection-pool-connections ط ActiveRecord::Base.connection_pool.checkin ApplicationRecord.connection ActiveRecord::Base.connection_pool.with_connection do # DBΛૢ࡞ end
Slide 34
Slide 34 text
ෳ߹ٕ SQLite3ͷίπͰDBίωΫγϣϯͷ্ݶΛ1ʹͨ͠ DBૢ࡞Λ5ඵҎʹऴΘΒͤͳ͍ͱλΠϜΞτ ͬͨΒଈղ์ δϣϒ͕ऴΘΔ·Ͱͬͯμϝ ͙͢ൃੜ͢ΔͷͰɺݕग़࿙Ε͠ʹ͍͘
Slide 35
Slide 35 text
AsyncAdapterͷҙ̎ Ωϡʔ͕Ұͭ ҰͭͷεϨουϓʔϧͰͯ͢ͷδϣϒΛॲཧ ༏ઌॱҐ੍͕ޚͰ͖ͳ͍ https://github.com/rails/rails/blob/master/activejob/lib/active_job/queue_adapters/async_adapter.rb
Slide 36
Slide 36 text
͍δϣϒͱ͍δϣϒ ͍δϣϒΛઌʹ࣮ߦ͍ͨ͠ ͍δϣϒ͕ऴΘΒͳ͍ͱ͍δϣϒΛ։࢝Ͱ͖ͳ͍ ͍δϣϒઐ༻ͷΩϡʔΛ࡞Δ
Slide 37
Slide 37 text
SuckerPunch https://github.com/brandonhilkert/sucker_punch Ωϡʔ͕δϣϒ͝ͱʹΘ͔Ε͍ͯΔ εϨουϓʔϧͰඇಉظॲཧΛ࣮ߦ https://api.rubyonrails.org/classes/ActiveJob/ QueueAdapters.html Priorities͕No??
Slide 38
Slide 38 text
SuckerPunchAdapter ΩϡʔͷࢦఆΛແࢹ͍ͯ͠Δ https://github.com/rails/rails/blob/master/activejob/lib/ active_job/queue_adapters/sucker_punch_adapter.rb
Slide 39
Slide 39 text
ϞϯΩʔύον module SuckerPunch module Job module ClassMethods def perform_async *_args, &block return unless SuckerPunch::RUNNING.true? queue = SuckerPunch::Queue.find_or_create to_s, num_workers, num_jobs_max queue.post { __run_perform(&block) } end def __run_perform SuckerPunch::Counter::Busy.new(to_s).increment result = yield SuckerPunch::Counter::Processed.new(to_s).increment result rescue StandardError => ex SuckerPunch::Counter::Failed.new(to_s).increment SuckerPunch.exception_handler.call ex, self, args ensure SuckerPunch::Counter::Busy.new(to_s).decrement end end end end module ActiveJob module QueueAdapters class SuckerPunchAdapter def enqueue job job.queue_name = job.class.to_s job.class.perform_async { Base.execute job.serialize } end end end end
Slide 40
Slide 40 text
·ͱΊ RailsͷநΠϯλϑΣʔεྑ͍ ActiveRecordɺActiveJob ϛυϧΣΞͷมߋ͕ՄೳʢθϩίετͰͳ͍ʣ ΞʔΩςΫνϟͷܾఆΛΒͤΒΕΔ ։ൃڥɺຊ൪ڥͷߏஙίετ͕ݮΒͤΔ ։ൃʹूதͰ͖Δ Ώͬ͘Γಈ͘ͱ͘ಈ͚Δ