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? => 10෼30ඵ

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 ϛυϧ΢ΣΞͷมߋ͕ՄೳʢθϩίετͰ͸ͳ͍ʣ ΞʔΩςΫνϟͷܾఆΛ஗ΒͤΒΕΔ ։ൃ؀ڥɺຊ൪؀ڥͷߏஙίετ͕ݮΒͤΔ ։ൃʹूதͰ͖Δ Ώͬ͘Γಈ͘ͱ଎͘ಈ͚Δ