Slide 1

Slide 1 text

ڞ௨ج൫γεςϜͷ։ൃʹ͍ͭͯ גࣜձࣾ Aiming ιϑτ΢ΣΞΤϯδχΞ ୩ಓ ૑ 2016/01/27 Aiming Study #8

Slide 2

Slide 2 text

ࣗݾ঺հ • ୩ಓ ૑ (Tsukuru Tanimichi) • @ttanimichi • Ruby, Java, DevOps • 2014/06 ೖࣾ • ౷߹ KPI γεςϜͷ։ൃ • ڞ௨ج൫γεςϜͷ։ൃ • ήʔϜλΠτϧͷ API ։ൃ • https://github.com/ttanimichi • https://twitter.com/ttanimichi

Slide 3

Slide 3 text

Aiming ͷήʔϜλΠτϧ 10 λΠτϧ͋Γ·͢

Slide 4

Slide 4 text

ͦΕͧΕͷήʔϜλΠτϧ͕

Slide 5

Slide 5 text

·ͬͨ͘ผݸͷγεςϜ ҟͳΔωοτϫʔΫ

Slide 6

Slide 6 text

ݸʑͷήʔϜ͸ಠཱͨ͠γεςϜ ྫ) ͙Δ͙ΔΠʔάϧͷωοτϫʔΫ ී௨ͷ Web ΞϓϦέʔγϣϯʹ͔ͳΓ͍ۙߏ੒ ϩʔυόϥϯα app app app MySQL Redis

Slide 7

Slide 7 text

ήʔϜλΠτϧΛ࡞Δͨͼʹ ຖճඞཁʹͳΔ΍ͭ

Slide 8

Slide 8 text

• ೝূ • ՝ۚॲཧ • νϟοτ • Push ௨஌ • ૬ޓૹ٬ • ͳͲͳͲ

Slide 9

Slide 9 text

ॎׂΓͰͦΕͧΕ࣮૷͍ͯͨ͠ɾɾɾ • ೝূ • ՝ۚॲཧ • νϟοτ • Push ௨஌ • ೝূ • ՝ۚॲཧ • Push ௨஌ • ೝূ • ՝ۚॲཧ • νϟοτ • Push ௨஌

Slide 10

Slide 10 text

ʊਓਓਓਓਓਓਓਓʊ ʼɹंྠͷ࠶ൃ໌ɹʻ ʉY^Y^Y^Y^Y^Y^Yʉ

Slide 11

Slide 11 text

• ଞͷήʔϜλΠτϧͷϞδϡʔϧΛίϐϖ ͯ͠࡞ͬͯ͠·͍ͬͯΔ৔߹΋͋Δ • ιʔείʔυΛಡΜͰ͍ΔͱଞͷήʔϜλ ΠτϧͷλΠτϧ໊͕ಥવग़͖ͯͨΓ • ͋·Γग़དྷͷྑ͘ͳ͍Ϟδϡʔϧ΍ઃܭ͕ ίϐϖͰൟ৩͢Δ

Slide 12

Slide 12 text

ͦΕʹՃ͑ͯɺ

Slide 13

Slide 13 text

• ϩετϨΨϦΞ • 2015೥10݄22೔ϦϦʔε • ӡӦݩ: גࣜձࣾ Aiming • ։ൃݩ: Perfect World Co.,Ltd

Slide 14

Slide 14 text

• ϩετϨΨϦΞ • 2015೥10݄22೔ϦϦʔε • ӡӦݩ: גࣜձࣾ Aiming • ։ൃݩ: Perfect World Co.,Ltd

Slide 15

Slide 15 text

• ϩετϨΨϦΞ • 2015೥10݄22೔ϦϦʔε • ӡӦݩ: גࣜձࣾ Aiming • ։ൃݩ: Perfect World Co.,Ltd ։ൃݩ͸தࠃͷ Perfect World ࣾ

Slide 16

Slide 16 text

தࠃͷήʔϜλΠτϧΛ ೔ຊͰϦϦʔε͢Δ৔߹ɺ ೝূͱ՝ۚͷॲཧʹ͍ͭͯ͸ ͪ͜ΒͰ༻ҙ͢Δඞཁ͕͋Δ

Slide 17

Slide 17 text

Ͳ͏͍͏͜ͱʁ • தࠃ͸ GooglePlay Store ͡Όͳ͍ • தࠃಠࣗͷετΞʹܨ͕ΔΑ͏ʹͳ͍ͬͯΔ • ͦͷลͷ࢓૊Έ͸ӡӦݩ͕༻ҙ͢ΔจԽ • SNS ΞΧ΢ϯτͱͷඥ෇͚ʢޙड़ʣ • Facebook, Twitter ͸தࠃ͔Βܨ͕Βͳ͍ • άϨʔτϑΝΠΞ΢Υʔϧ

Slide 18

Slide 18 text

ڞ௨ج൫γεςϜ࡞Δͧʂʂ

Slide 19

Slide 19 text

ڞ௨ج൫γεςϜΛ࡞ͬͨܦҢ·ͱΊ • ήʔϜλΠτϧؒͰॏෳ͢ΔϞδϡʔϧͷ ଟॏ։ൃΛ΍Ί͔ͨͬͨ • தࠃͷήʔϜλΠτϧΛ೔ຊͰϦϦʔε
 ͢ΔͨΊʹೝূͱ՝ۚͷॲཧΛ༻ҙ͢Δ
 ඞཁ͕͋ͬͨ

Slide 20

Slide 20 text

ࠓճͷ Scope

Slide 21

Slide 21 text

• ೝূ • ՝ۚ • νϟοτ • Push ௨஌ • ૬ޓૹ٬ • ͳͲͳͲ

Slide 22

Slide 22 text

• ೝূ • ՝ۚ • νϟοτ • Push ௨஌ • ૬ޓૹ٬ • ͳͲͳͲ ← ࡞Γ·ͨ͠ ← ࡞Γ·ͨ͠

Slide 23

Slide 23 text

ཁ݅

Slide 24

Slide 24 text

ೝূ • ΞΧ΢ϯτΛൃߦͰ͖Δ • SNS ΞΧ΢ϯτͱඥ෇͚Ͱ͖Δ • ػछมߋͳͲΛͨ͠ͱ͖ʹ SNS ΞΧ΢ϯ τ͔ΒήʔϜσʔλΛ෮ݩͰ͖Δ

Slide 25

Slide 25 text

՝ۚ • Ϣʔβʔʹੜ೥݄Λೖྗ͍ͤͨ͞ • ະ੒೥͕՝ۚ͠Α͏ͱͨ͠ͱ͖ʹ͸อޢऀ ͷ͓ΏΔ͠ΛಘΔΑ͏ද͍ࣔͨ͠ • Ϩγʔτͷ verify ͳͲνʔτରࡦ͕͍ͨ͠ ʢ͍͕ͭ͜Ұ൪େมʂʣ

Slide 26

Slide 26 text

ڞ௨ج൫γεςϜͷ։ൃ

Slide 27

Slide 27 text

ϝϯόʔߏ੒ • औΓ·ͱΊʢ1໊ʣ • αʔόʔʢ1໊ʣ← ࢲ͕୲౰ • iOSΤϯδχΞʢ1໊ʣ • Android ΤϯδχΞʢ1໊ʣ ͳͷͰࠓ೔͸αʔόʔͷ࿩Λ͠·͢

Slide 28

Slide 28 text

։ൃظؒ • 7,8 ϲ݄ؒ͘Β͍ • 2015೥9݄ v1.0 ϦϦʔε

Slide 29

Slide 29 text

νʔϜϏϧσΟϯά • ࣾ಺ͷΫϥΠΞϯταΠυͷΤϯδχΞʹ͸ Unity(C#) ͕ଟ͍ɻiOS(Objective-C) ΍ Android(Java) Λॻ͚Δਓ͕গͳ͍ • ۀ຿ҕୗͷ iOS, Android ΤϯδχΞΛޏͬͨ • ۀ຿ҕୗͷΤϯδχΞʹ GitHub ͷ࢖͍ํ΍ ΞδϟΠϧ։ൃͷϑϩʔΛ·֮ͣ͑ͯ΋Β͏

Slide 30

Slide 30 text

• Ruby 2.2 • Ruby on Rails 4.2 • MySQL • nginx

Slide 31

Slide 31 text

• CircleCI • Slack • GitHub • Ansible • serverspec

Slide 32

Slide 32 text

iOS • CocoaPods • Objective-C Android • Gradle • Android Studio

Slide 33

Slide 33 text

Ͳ͏͍͏࡞Γʹ͔ͨ͠

Slide 34

Slide 34 text

Α͋͘Δڞ௨ج൫γεςϜͷ࡞Γ • αʔϏεͱڞ௨ج൫Λͻͱͭͷ mBaaS ͱͯ͠࡞Δ • ڞ௨ج൫γεςϜ্ʹ֤αʔϏεΛ૊ΈࠐΉ ໰୊఺ • ڞ௨ج൫γεςϜͱήʔϜλΠτϧͷґଘؔ܎ • ಛఆͷϓϩάϥϛϯάݴޠʹશαʔϏε͕ϩοΫΠϯ • ݹ͍όʔδϣϯͷݴޠॲཧܥͷར༻Λڧ੍͞ΕΔ

Slide 35

Slide 35 text

࣌୅͸ Microservices

Slide 36

Slide 36 text

Network ڞ௨ج൫ γεςϜ ήʔϜ αʔόʔ HTTPS (JSON)

Slide 37

Slide 37 text

• ֤ήʔϜλΠτϧͷωοτϫʔΫ಺ʹ
 ڞ௨ج൫γεςϜΛσϓϩΠ • HTTPS (JSON)Ͱ΍ΓͱΓ͢Δ෼ࢄγεςϜ • ήʔϜαʔόʔ͸ڞ௨ج൫γεςϜͷ
 ϚχϡΞϧʹै͍ϦΫΤετΛૹड৴ Network ڞ௨ج൫ γεςϜ ήʔϜ αʔόʔ HTTPS (JSON)

Slide 38

Slide 38 text

• Objective-C, Java Ͱ 
 ࡞ͬͨڞ௨ج൫
 ϥΠϒϥϦΛϥοϓͯ͠ Unity Plugin ʹ͢Δ • ΫϥΠΞϯτଆʹ͸
 ڞ௨ج൫γεςϜ༻ͷ Unity Plugin Λ૊ΈࠐΉ • αʔόʔͱ HTTPS Ͱ௨৴ ڞ௨ج൫ γεςϜ HTTPS (JSON) Client Unity Plugin

Slide 39

Slide 39 text

Network ήʔϜ αʔόʔ ڞ௨ج൫ γεςϜ • ڞ௨ج൫ͱήʔϜ͸
 ผʑͷݴޠͰ΋͍͍ • IaaS ͷো֐ͰҰํ͚ͩ
 མͪΔ͜ͱ͕ͳ͍Α͏ಉҰ ͷωοτϫʔΫ಺ʹஔ͘ Client Unity Plugin

Slide 40

Slide 40 text

ϑϩʔ

Slide 41

Slide 41 text

৽نొ࿥ ᶃ ΞΧ΢ϯτൃߦ Client Unity Plugin ڞ௨ج൫ γεςϜ ήʔϜ αʔόʔ

Slide 42

Slide 42 text

ϩάΠϯ ήʔϜ αʔόʔ ᶄ ΞΧ΢ϯτΛ໰͍߹ΘͤΔ ᶃϩάΠϯΛϦΫΤετ ᶅ Ϩεϙϯε Client Unity Plugin ڞ௨ج൫ γεςϜ

Slide 43

Slide 43 text

SNS ΞΧ΢ϯτͱͷඥ෇͚ ڞ௨ج൫ γεςϜ ᶄ αʔόʔʹૹΔ Twitter Facebook google+ ᶃ access_token Λऔಘ ᶅ SNS ͷ uid Λऔಘ ΞΧ΢ϯτͱ uid Λඥ͚ͮΔ Client Unity Plugin

Slide 44

Slide 44 text

ػछมߋ࣌ͳͲͷҾ͖ܧ͗ ᶅ SNS ͷ uid Λऔಘ SNS ͷ uid ͔ΒΞΧ΢ϯτΛऔಘ → ͦͷΞΧ΢ϯτΛ࢖͏ ڞ௨ج൫ γεςϜ ᶄ αʔόʔʹૹΔ Twitter Facebook google+ ᶃ access_token Λऔಘ Client Unity Plugin

Slide 45

Slide 45 text

# app/models/account.rb class Account < ActiveRecord::Base has_many :connections, dependent: :destroy has_many :orders, class_name: 'Purchase::Order' before_create do self.auth_id = SecureRandom.uuid self.auth_token = SecureRandom.hex end def already_connected_with?(provider) connections.find_by(provider: provider).present? end def overwrite_connection(provider:, provider_uid:) connections.find_by!(provider: provider).update!(provider_uid: provider_uid) end def register_birth_date(year, month) update!(birth_date: build_birth_date(year, month)) end def child? become_adult_day.future? end private def become_adult_day birth_date + 20.years + 1.month end

Slide 46

Slide 46 text

՝ۚͷϑϩʔ

Slide 47

Slide 47 text

τϥϯβΫγϣϯIDൃߦ ήʔϜ αʔόʔ ڞ௨ج൫ γεςϜ ᶃ τϥϯβΫγϣϯIDൃߦ Client Unity Plugin

Slide 48

Slide 48 text

ߪೖͱϨγʔτͷडཧ Client Unity Plugin ڞ௨ج൫ γεςϜ ᶄϨγʔτૹ৴ AppStore GooglePlay τϥϯβΫγϣϯID Λ
 ɾapplicationUsername (iOS)
 ɾdeveloper payload (Android) ʹ٧ΊͯɺߪೖΛ࣮ߦ
 ͜͏͓ͯ͘͠ͱϨγʔτͱҰॹʹ τϥϯβΫγϣϯ ID ͕ฦͬͯ͘Δ → ࠶Πϯετʔϧͯ͠΋อ࣋͞ΕΔ ᶃ ߪೖ

Slide 49

Slide 49 text

Verify ͱৼΓࠐΈ ήʔϜ αʔόʔ ڞ௨ج൫ γεςϜ AppStore ᶃ Ϩγʔτͷݕূ ᶄৼࠐ iOS ͸ Apple ͷαʔόʔͰ verify
 Android ͸खݩͰ verify Ͱ͖Δ verify Ͱ͖ͨΒΞΠςϜΛৼࠐΉ

Slide 50

Slide 50 text

՝ۚͷνʔτରࡦ աڈʹฐ͕ࣾܦݧͨ͠νʔτํ๏͢΂ͯʹରࡦ • ِ෺ͷϨγʔτΛૹΓ͚ͭͯ͘Δ • ຊ෺ͷϨγʔτ͚ͩͲطʹৼࠐࡁΈͷϨγʔτ • ຊ෺ͷϨγʔτ͚ͩͲଞͷΞϓϦͷϨγʔτ ΛϚϧνϓϩηεલఏͰରࡦ • τϥϯβΫγϣϯΛऔͬͯߦϩοΫͰഉଞ੍ޚ
 ʢActiveRecord ͷ `#with_lock` Λ࢖ͬͨʣ

Slide 51

Slide 51 text

݁ߏ͠ΜͲ͔ͬͨ͆

Slide 52

Slide 52 text

• ͍͕ͭ͜όάͬͯͨΓରࡦ͕͋·͔ͬͨΓ ͢Δͱ࠾༻͍ͯ͠Δࣾ಺ͷશήʔϜλΠτ ϧ͕νʔτ͞ΕΔ • νʔτରࡦɺ࣮ࡍʹίʔσΟϯάͯ͠ΈΔ ͱ͚ͬ͜͏ߟ͑ͳ͍ͱ͍͚ͳ͍͜ͱ͕ଟ͍ • Ϛϧνϓϩηεલఏ • ฒྻॲཧͬͯͦ΋ͦ΋೉͗͢͠ΔΑͶ

Slide 53

Slide 53 text

Gemfile ެ։ͪ͠Ό͍·͢ https://gist.github.com/ttanimichi/5f63897d746b7491fbf7

Slide 54

Slide 54 text

• gem “venice” • iOS Ϩγʔτͷ verify Λ΍ͬͯ͘ΕΔ gem • iOS 7ͷ৽ϨγʔτܗࣜʹରԠ͔ͨͬͨ͠
 ͷͰ fork ൛ͷ “amoslanka/venice” Λ࢖ͬͨ • ສ͕Ұফ͞ΕΔͱࠔΔͷͰ fork ͠ͱ͍ͨ ศརͩͬͨ gem

Slide 55

Slide 55 text

# app/models/purchase/receipt/app_store.rb module Purchase module Receipt class AppStore def initialize(raw_receipt:, bundle_id:, store_transaction_id:) @raw_receipt = raw_receipt @bundle_id = bundle_id @store_transaction_id = store_transaction_id end def verify verify_receipt fail_unless_correct_bundle_id build_result end private def verify_receipt begin @receipt ||= Venice::Receipt.verify!(@raw_receipt).to_h rescue Venice::Receipt::VerificationError => e handle_error(e.code, e.message) end end def fail_unless_correct_bundle_id unless @bundle_id == receipt[:bundle_id] fail Incorrect, "bundle_id is incorrect" end end

Slide 56

Slide 56 text

։ൃ্ͷϙΠϯτ

Slide 57

Slide 57 text

ΞϓϦέʔγϣϯαʔόʔͷબఆ ΞʔΩςΫνϟ unicorn ϓϩηεϕʔε fork Λ࢖ͬͨ master-slave Puma ϚϧνεϨου Thin Πϕϯτۦಈ EventMachine ʹґଘ

Slide 58

Slide 58 text

ΞϓϦέʔγϣϯαʔόʔͷબఆ • ࠷ॳ͸Կ΋ߟ͑ͣʹ unicorn Λ࢖͍ͬͯͨ • ՝ۚͷΤϯυϙΠϯτʹͪΐͬͱෛՙΛ͔͚ ͯΈΔͱ٧·Δ • ਺ेඵ΄Ͳ଴ͭͱϨεϙϯε͕ฦͬͯ͘Δ

Slide 59

Slide 59 text

verify ͷͨΊʹ Apple ͷαʔόʔʹϦΫΤετΛ ౤͍͛ͯͯɺ600ms ΄ͲϒϩοΫ͞Εͯ͠·͏
 → ෛՙ͕͔͔Δͱ͢΂ͯͷ Worker ͕٧·Δ

Slide 60

Slide 60 text

ΞϓϦέʔγϣϯαʔόʔͷબఆ iOS ͷϨγʔτΛ verify ͢ΔαʔόʔͷΑ͏ ͳ஗͍ॲཧ (ϦϞʔτHTTP ϦΫΤετͱ͔) ΛؚΉΤϯυϙΠϯτͷ৔߹ɺunicorn ͷΑ͏ ͳϓϩηεϕʔεͷΞϓϦέʔγϣϯαʔόʔ Λ࢖͏΂͖Ͱ͸ͳ͍

Slide 61

Slide 61 text

ΞϓϦέʔγϣϯαʔόʔͷબఆ • unicorn ͸ߴ଎͕ͩɺϓϩηεϕʔεͷͨΊ
 ಉ͡ϝϞϦʔྔͰ༻ҙͰ͖Δ Worker ਺͸
 εϨουϕʔεͷ Puma ͷ΄͏͕ଟ͍ • Puma ʹมߋ • ຊ౰͸Πϕϯτۦಈͷ Thin ͕ϕετͩͬͨ ͷ͔΋ɻPuma Ͱे෼ͳੑೳ͕ग़͔ͨΒ Thin ͸ݕূ͠ͳ͔ͬͨ

Slide 62

Slide 62 text

iOS ͷ applicationUsername • ࠶Πϯετʔϧͨ͠৔߹Ͱ΋τϥϯβΫγϣ ϯIDΛอ࣋Ͱ͖ΔΑ͏ɺ঎඼ͷߪೖ࣌ʹ applicationUsername ʹڞ௨ج൫γεςϜͷ τϥϯβΫγϣϯID Λ٧Ίͨ • ͕ɺͳ͔ͥ production ͩͱ100 ݅ʹ1݅͘Β ͍ applicationUsername ʹ٧Ίͨσʔλ͕ ਧͬඈΜͰ Null Ͱฦͬͯ͘Δɻɻ

Slide 63

Slide 63 text

Apple ༷…

Slide 64

Slide 64 text

ϦϦʔεͯ͠Έͯࢥͬͨ͜ͱ

Slide 65

Slide 65 text

ಛʹ՝ۚ·ΘΓͷॲཧΛ ڞ௨ԽͰ͖ͨͷ͸ྑ͔ͬͨ • νʔτରࡦͱ͔ • όά͕ͳ͍Α͏ʹ࡞Δͷ͸ਆܦΛ࢖͏ • ݸผʹ࣮૷ͨ͘͠ͳ͍ • ձࣾͱͯ͠౷Ұ͞Ε͍ͯΔ΂͖

Slide 66

Slide 66 text

Կ΋ߟ͑ͳͯ͘΋ձࣾͱͯ͠ͷ ΨΠυϥΠϯʹै͑Δͷ͸ྑ͍ • ೥ྸ֬ೝ·ΘΓͱ͔ • ੜ೥݄Λೖྗͤͯ͞ɺະ੒೥ʹ͸֬ೝ • ͜͏͍͏ͷ͸ձࣾͱͯ͠ͷΨΠυϥΠϯ͕ ༻ҙ͞Ε͍ͯΔ • ڞ௨ج൫γεςϜΛ࢖͏͚ͩͰΨΠυϥΠ ϯʹଇͬͱΕΔ

Slide 67

Slide 67 text

SNS ΞΧ΢ϯτͰҾ͖ܧ͗ • ࠓճɺҾ͖ܧ͗ͷཧ૝ܗΛݕ౼ͨ͠ • ڞ௨ج൫γεςϜΛ࢖͏͚ͩͰձࣾͱͯ͠ ཧ૝ܗͱߟ͑ΔҾ͖ܧ͗ॲཧΛಋೖͰ͖Δ • ௿ίετͰߴ͍ϢʔβʔମݧΛఏڙͰ͖Δ

Slide 68

Slide 68 text

ࠓޙʹ͍ͭͯ

Slide 69

Slide 69 text

• ೝূ • ՝ۚ • νϟοτ • Push ௨஌ • ૬ޓૹ٬ • ͳͲͳͲ ͜ͷลΛਐΊ͍͖͍ͯͨ

Slide 70

Slide 70 text

• ೝূ • ՝ۚ • νϟοτ • Push ௨஌ • ૬ޓૹ٬ • ͳͲͳͲ ͪ͜Βʹؔͯ͠΋ ػೳ௥Ճͷ ཁ๬͕Ͱ͍ͯΔ

Slide 71

Slide 71 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠