Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
共通基盤システムの開発について
Tsukuru Tanimichi
January 27, 2016
Technology
5
12k
共通基盤システムの開発について
http://aiming.connpass.com/event/25004/
での発表資料です
Tsukuru Tanimichi
January 27, 2016
Tweet
Share
More Decks by Tsukuru Tanimichi
See All by Tsukuru Tanimichi
react-rails で SPA, SSR を実現する / react-rails-spa-ssr
ttanimichi
2
610
マネーフォワードにおけるウェブメディア高速化の取り組み / yamagoya2018
ttanimichi
7
1.9k
WebSocket はどれくらい通じるのかの統計 / websocket-connectivity-survey
ttanimichi
0
480
大規模 Padrino アプリケーション Rails 移行 / Migrating to Rails from Padrino
ttanimichi
0
12k
Other Decks in Technology
See All in Technology
マネーフォワードクラウドを支える事業者基盤
machisuke
0
210
UNIX は知らない。でも AWS は知ってる。 そんな僕が『 UNIX という考え方』を 読んでみた件
kentosuzuki
1
270
Cloudflare Workersで動くOG画像生成器
aiji42
1
430
ML PM, DS PMってどんな仕事をしているの?
line_developers
PRO
1
190
なぜ変化を起こすのが難しいのか? - 数年以上にわたって難しさに向き合い・考え取り組んできたこと / The reason why changing organization is so hard - What I thought and faced for more than several years
iwashi86
26
17k
Virtual Thread - 導入の背景と、効果的な使い方 -
skrb
3
230
学びを仕事に繋げる
sansanbuildersbox
15
5.9k
Optimizing your Swift code
kateinoigakukun
0
1.3k
「私考える人、あなた作業する人」を越えて、プロダクトマネジメントがあたりまえになるチームを明日から実現していく方法/product management rsgt2023
moriyuya
61
38k
- Rでオブジェクト指向プログラミング- クラス設計入門の入門
kotatyamtema
1
530
グローバルチームことはじめ / Bootstrapping a global team
tasshi
1
530
成長が鈍化したチームを変えるためにやったこと / #RSGT2023
mongolyy
2
2.8k
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
116
7.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
643
54k
How GitHub Uses GitHub to Build GitHub
holman
465
280k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
349
27k
Adopting Sorbet at Scale
ufuk
65
7.8k
The Power of CSS Pseudo Elements
geoffreycrofte
52
4.3k
Design by the Numbers
sachag
271
18k
VelocityConf: Rendering Performance Case Studies
addyosmani
317
22k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
7
560
Rails Girls Zürich Keynote
gr2m
87
12k
How New CSS Is Changing Everything About Graphic Design on the Web
jensimmons
214
12k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
13
5.4k
Transcript
ڞ௨ج൫γεςϜͷ։ൃʹ͍ͭͯ גࣜձࣾ Aiming ιϑτΣΞΤϯδχΞ ୩ಓ 2016/01/27 Aiming Study #8
ࣗݾհ • ୩ಓ (Tsukuru Tanimichi) • @ttanimichi • Ruby,
Java, DevOps • 2014/06 ೖࣾ • ౷߹ KPI γεςϜͷ։ൃ • ڞ௨ج൫γεςϜͷ։ൃ • ήʔϜλΠτϧͷ API ։ൃ • https://github.com/ttanimichi • https://twitter.com/ttanimichi
Aiming ͷήʔϜλΠτϧ 10 λΠτϧ͋Γ·͢
ͦΕͧΕͷήʔϜλΠτϧ͕
·ͬͨ͘ผݸͷγεςϜ ҟͳΔωοτϫʔΫ
ݸʑͷήʔϜಠཱͨ͠γεςϜ ྫ) ͙Δ͙ΔΠʔάϧͷωοτϫʔΫ ී௨ͷ Web ΞϓϦέʔγϣϯʹ͔ͳΓ͍ۙߏ ϩʔυόϥϯα app app app
MySQL Redis
ήʔϜλΠτϧΛ࡞Δͨͼʹ ຖճඞཁʹͳΔͭ
• ೝূ • ՝ۚॲཧ • νϟοτ • Push ௨ •
૬ޓૹ٬ • ͳͲͳͲ
ॎׂΓͰͦΕͧΕ࣮͍ͯͨ͠ɾɾɾ • ೝূ • ՝ۚॲཧ • νϟοτ • Push ௨
• ೝূ • ՝ۚॲཧ • Push ௨ • ೝূ • ՝ۚॲཧ • νϟοτ • Push ௨
ʊਓਓਓਓਓਓਓਓʊ ʼɹंྠͷ࠶ൃ໌ɹʻ ʉY^Y^Y^Y^Y^Y^Yʉ
• ଞͷήʔϜλΠτϧͷϞδϡʔϧΛίϐϖ ͯ͠࡞ͬͯ͠·͍ͬͯΔ߹͋Δ • ιʔείʔυΛಡΜͰ͍ΔͱଞͷήʔϜλ ΠτϧͷλΠτϧ໊͕ಥવग़͖ͯͨΓ • ͋·Γग़དྷͷྑ͘ͳ͍Ϟδϡʔϧઃܭ͕ ίϐϖͰൟ৩͢Δ
ͦΕʹՃ͑ͯɺ
• ϩετϨΨϦΞ • 201510݄22ϦϦʔε • ӡӦݩ: גࣜձࣾ Aiming • ։ൃݩ:
Perfect World Co.,Ltd
• ϩετϨΨϦΞ • 201510݄22ϦϦʔε • ӡӦݩ: גࣜձࣾ Aiming • ։ൃݩ:
Perfect World Co.,Ltd
• ϩετϨΨϦΞ • 201510݄22ϦϦʔε • ӡӦݩ: גࣜձࣾ Aiming • ։ൃݩ:
Perfect World Co.,Ltd ։ൃݩதࠃͷ Perfect World ࣾ
தࠃͷήʔϜλΠτϧΛ ຊͰϦϦʔε͢Δ߹ɺ ೝূͱ՝ۚͷॲཧʹ͍ͭͯ ͪ͜ΒͰ༻ҙ͢Δඞཁ͕͋Δ
Ͳ͏͍͏͜ͱʁ • தࠃ GooglePlay Store ͡Όͳ͍ • தࠃಠࣗͷετΞʹܨ͕ΔΑ͏ʹͳ͍ͬͯΔ • ͦͷลͷΈӡӦݩ͕༻ҙ͢ΔจԽ
• SNS ΞΧϯτͱͷඥ͚ʢޙड़ʣ • Facebook, Twitter தࠃ͔Βܨ͕Βͳ͍ • άϨʔτϑΝΠΞΥʔϧ
ڞ௨ج൫γεςϜ࡞Δͧʂʂ
ڞ௨ج൫γεςϜΛ࡞ͬͨܦҢ·ͱΊ • ήʔϜλΠτϧؒͰॏෳ͢ΔϞδϡʔϧͷ ଟॏ։ൃΛΊ͔ͨͬͨ • தࠃͷήʔϜλΠτϧΛຊͰϦϦʔε ͢ΔͨΊʹೝূͱ՝ۚͷॲཧΛ༻ҙ͢Δ ඞཁ͕͋ͬͨ
ࠓճͷ Scope
• ೝূ • ՝ۚ • νϟοτ • Push ௨ •
૬ޓૹ٬ • ͳͲͳͲ
• ೝূ • ՝ۚ • νϟοτ • Push ௨ •
૬ޓૹ٬ • ͳͲͳͲ ← ࡞Γ·ͨ͠ ← ࡞Γ·ͨ͠
ཁ݅
ೝূ • ΞΧϯτΛൃߦͰ͖Δ • SNS ΞΧϯτͱඥ͚Ͱ͖Δ • ػछมߋͳͲΛͨ͠ͱ͖ʹ SNS ΞΧϯ
τ͔ΒήʔϜσʔλΛ෮ݩͰ͖Δ
՝ۚ • Ϣʔβʔʹੜ݄Λೖྗ͍ͤͨ͞ • ະ͕՝ۚ͠Α͏ͱͨ͠ͱ͖ʹอޢऀ ͷ͓ΏΔ͠ΛಘΔΑ͏ද͍ࣔͨ͠ • Ϩγʔτͷ verify ͳͲνʔτରࡦ͕͍ͨ͠
ʢ͍͕ͭ͜Ұ൪େมʂʣ
ڞ௨ج൫γεςϜͷ։ൃ
ϝϯόʔߏ • औΓ·ͱΊʢ1໊ʣ • αʔόʔʢ1໊ʣ← ࢲ͕୲ • iOSΤϯδχΞʢ1໊ʣ • Android
ΤϯδχΞʢ1໊ʣ ͳͷͰࠓαʔόʔͷΛ͠·͢
։ൃظؒ • 7,8 ϲ݄ؒ͘Β͍ • 20159݄ v1.0 ϦϦʔε
νʔϜϏϧσΟϯά • ࣾͷΫϥΠΞϯταΠυͷΤϯδχΞʹ Unity(C#) ͕ଟ͍ɻiOS(Objective-C) Android(Java) Λॻ͚Δਓ͕গͳ͍ • ۀҕୗͷ
iOS, Android ΤϯδχΞΛޏͬͨ • ۀҕୗͷΤϯδχΞʹ GitHub ͷ͍ํ ΞδϟΠϧ։ൃͷϑϩʔΛ·֮ͣ͑ͯΒ͏
• Ruby 2.2 • Ruby on Rails 4.2 • MySQL
• nginx
• CircleCI • Slack • GitHub • Ansible • serverspec
iOS • CocoaPods • Objective-C Android • Gradle • Android
Studio
Ͳ͏͍͏࡞Γʹ͔ͨ͠
Α͋͘Δڞ௨ج൫γεςϜͷ࡞Γ • αʔϏεͱڞ௨ج൫Λͻͱͭͷ mBaaS ͱͯ͠࡞Δ • ڞ௨ج൫γεςϜ্ʹ֤αʔϏεΛΈࠐΉ • ڞ௨ج൫γεςϜͱήʔϜλΠτϧͷґଘؔ
• ಛఆͷϓϩάϥϛϯάݴޠʹશαʔϏε͕ϩοΫΠϯ • ݹ͍όʔδϣϯͷݴޠॲཧܥͷར༻Λڧ੍͞ΕΔ
࣌ Microservices
Network ڞ௨ج൫ γεςϜ ήʔϜ αʔόʔ HTTPS (JSON)
• ֤ήʔϜλΠτϧͷωοτϫʔΫʹ ڞ௨ج൫γεςϜΛσϓϩΠ • HTTPS (JSON)ͰΓͱΓ͢ΔࢄγεςϜ • ήʔϜαʔόʔڞ௨ج൫γεςϜͷ ϚχϡΞϧʹै͍ϦΫΤετΛૹड৴ Network
ڞ௨ج൫ γεςϜ ήʔϜ αʔόʔ HTTPS (JSON)
• Objective-C, Java Ͱ ࡞ͬͨڞ௨ج൫ ϥΠϒϥϦΛϥοϓͯ͠ Unity Plugin ʹ͢Δ
• ΫϥΠΞϯτଆʹ ڞ௨ج൫γεςϜ༻ͷ Unity Plugin ΛΈࠐΉ • αʔόʔͱ HTTPS Ͱ௨৴ ڞ௨ج൫ γεςϜ HTTPS (JSON) Client Unity Plugin
Network ήʔϜ αʔόʔ ڞ௨ج൫ γεςϜ • ڞ௨ج൫ͱήʔϜ ผʑͷݴޠͰ͍͍ • IaaS
ͷোͰҰํ͚ͩ མͪΔ͜ͱ͕ͳ͍Α͏ಉҰ ͷωοτϫʔΫʹஔ͘ Client Unity Plugin
ϑϩʔ
৽نొ ᶃ ΞΧϯτൃߦ Client Unity Plugin ڞ௨ج൫ γεςϜ ήʔϜ αʔόʔ
ϩάΠϯ ήʔϜ αʔόʔ ᶄ ΞΧϯτΛ͍߹ΘͤΔ ᶃϩάΠϯΛϦΫΤετ ᶅ Ϩεϙϯε Client Unity
Plugin ڞ௨ج൫ γεςϜ
SNS ΞΧϯτͱͷඥ͚ ڞ௨ج൫ γεςϜ ᶄ αʔόʔʹૹΔ Twitter Facebook google+ ᶃ
access_token Λऔಘ ᶅ SNS ͷ uid Λऔಘ ΞΧϯτͱ uid Λඥ͚ͮΔ Client Unity Plugin
ػछมߋ࣌ͳͲͷҾ͖ܧ͗ ᶅ SNS ͷ uid Λऔಘ SNS ͷ uid ͔ΒΞΧϯτΛऔಘ
→ ͦͷΞΧϯτΛ͏ ڞ௨ج൫ γεςϜ ᶄ αʔόʔʹૹΔ Twitter Facebook google+ ᶃ access_token Λऔಘ Client Unity Plugin
# 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
՝ۚͷϑϩʔ
τϥϯβΫγϣϯIDൃߦ ήʔϜ αʔόʔ ڞ௨ج൫ γεςϜ ᶃ τϥϯβΫγϣϯIDൃߦ Client Unity Plugin
ߪೖͱϨγʔτͷडཧ Client Unity Plugin ڞ௨ج൫ γεςϜ ᶄϨγʔτૹ৴ AppStore GooglePlay τϥϯβΫγϣϯID
Λ ɾapplicationUsername (iOS) ɾdeveloper payload (Android) ʹ٧ΊͯɺߪೖΛ࣮ߦ ͜͏͓ͯ͘͠ͱϨγʔτͱҰॹʹ τϥϯβΫγϣϯ ID ͕ฦͬͯ͘Δ → ࠶Πϯετʔϧͯ͠อ࣋͞ΕΔ ᶃ ߪೖ
Verify ͱৼΓࠐΈ ήʔϜ αʔόʔ ڞ௨ج൫ γεςϜ AppStore ᶃ Ϩγʔτͷݕূ ᶄৼࠐ
iOS Apple ͷαʔόʔͰ verify Android खݩͰ verify Ͱ͖Δ verify Ͱ͖ͨΒΞΠςϜΛৼࠐΉ
՝ۚͷνʔτରࡦ աڈʹฐ͕ࣾܦݧͨ͠νʔτํ๏ͯ͢ʹରࡦ • ِͷϨγʔτΛૹΓ͚ͭͯ͘Δ • ຊͷϨγʔτ͚ͩͲطʹৼࠐࡁΈͷϨγʔτ • ຊͷϨγʔτ͚ͩͲଞͷΞϓϦͷϨγʔτ ΛϚϧνϓϩηεલఏͰରࡦ •
τϥϯβΫγϣϯΛऔͬͯߦϩοΫͰഉଞ੍ޚ ʢActiveRecord ͷ `#with_lock` Λͬͨʣ
݁ߏ͠ΜͲ͔ͬͨ͆
• ͍͕ͭ͜όάͬͯͨΓରࡦ͕͋·͔ͬͨΓ ͢Δͱ࠾༻͍ͯ͠ΔࣾͷશήʔϜλΠτ ϧ͕νʔτ͞ΕΔ • νʔτରࡦɺ࣮ࡍʹίʔσΟϯάͯ͠ΈΔ ͱ͚ͬ͜͏ߟ͑ͳ͍ͱ͍͚ͳ͍͜ͱ͕ଟ͍ • Ϛϧνϓϩηεલఏ •
ฒྻॲཧͬͯͦͦ͗͢͠ΔΑͶ
Gemfile ެ։ͪ͠Ό͍·͢ https://gist.github.com/ttanimichi/5f63897d746b7491fbf7
• gem “venice” • iOS Ϩγʔτͷ verify Λͬͯ͘ΕΔ gem •
iOS 7ͷ৽ϨγʔτܗࣜʹରԠ͔ͨͬͨ͠ ͷͰ fork ൛ͷ “amoslanka/venice” Λͬͨ • ສ͕Ұফ͞ΕΔͱࠔΔͷͰ fork ͠ͱ͍ͨ ศརͩͬͨ gem
# 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
։ൃ্ͷϙΠϯτ
ΞϓϦέʔγϣϯαʔόʔͷબఆ ΞʔΩςΫνϟ unicorn ϓϩηεϕʔε fork Λͬͨ master-slave Puma ϚϧνεϨου Thin
Πϕϯτۦಈ EventMachine ʹґଘ
ΞϓϦέʔγϣϯαʔόʔͷબఆ • ࠷ॳԿߟ͑ͣʹ unicorn Λ͍ͬͯͨ • ՝ۚͷΤϯυϙΠϯτʹͪΐͬͱෛՙΛ͔͚ ͯΈΔͱ٧·Δ • ेඵ΄ͲͭͱϨεϙϯε͕ฦͬͯ͘Δ
verify ͷͨΊʹ Apple ͷαʔόʔʹϦΫΤετΛ ͍͛ͯͯɺ600ms ΄ͲϒϩοΫ͞Εͯ͠·͏ → ෛՙ͕͔͔Δͱͯ͢ͷ Worker ͕٧·Δ
ΞϓϦέʔγϣϯαʔόʔͷબఆ iOS ͷϨγʔτΛ verify ͢ΔαʔόʔͷΑ͏ ͳ͍ॲཧ (ϦϞʔτHTTP ϦΫΤετͱ͔) ΛؚΉΤϯυϙΠϯτͷ߹ɺunicorn ͷΑ͏
ͳϓϩηεϕʔεͷΞϓϦέʔγϣϯαʔόʔ Λ͏͖Ͱͳ͍
ΞϓϦέʔγϣϯαʔόʔͷબఆ • unicorn ߴ͕ͩɺϓϩηεϕʔεͷͨΊ ಉ͡ϝϞϦʔྔͰ༻ҙͰ͖Δ Worker εϨουϕʔεͷ Puma ͷ΄͏͕ଟ͍
• Puma ʹมߋ • ຊΠϕϯτۦಈͷ Thin ͕ϕετͩͬͨ ͷ͔ɻPuma Ͱेͳੑೳ͕ग़͔ͨΒ Thin ݕূ͠ͳ͔ͬͨ
iOS ͷ applicationUsername • ࠶Πϯετʔϧͨ͠߹ͰτϥϯβΫγϣ ϯIDΛอ࣋Ͱ͖ΔΑ͏ɺͷߪೖ࣌ʹ applicationUsername ʹڞ௨ج൫γεςϜͷ τϥϯβΫγϣϯID Λ٧Ίͨ
• ͕ɺͳ͔ͥ production ͩͱ100 ݅ʹ1݅͘Β ͍ applicationUsername ʹ٧Ίͨσʔλ͕ ਧͬඈΜͰ Null Ͱฦͬͯ͘Δɻɻ
Apple ༷…
ϦϦʔεͯ͠Έͯࢥͬͨ͜ͱ
ಛʹ՝ۚ·ΘΓͷॲཧΛ ڞ௨ԽͰ͖ͨͷྑ͔ͬͨ • νʔτରࡦͱ͔ • όά͕ͳ͍Α͏ʹ࡞ΔͷਆܦΛ͏ • ݸผʹ࣮ͨ͘͠ͳ͍ • ձࣾͱͯ͠౷Ұ͞Ε͍ͯΔ͖
Կߟ͑ͳͯ͘ձࣾͱͯ͠ͷ ΨΠυϥΠϯʹै͑Δͷྑ͍ • ྸ֬ೝ·ΘΓͱ͔ • ੜ݄Λೖྗͤͯ͞ɺະʹ֬ೝ • ͜͏͍͏ͷձࣾͱͯ͠ͷΨΠυϥΠϯ͕ ༻ҙ͞Ε͍ͯΔ •
ڞ௨ج൫γεςϜΛ͏͚ͩͰΨΠυϥΠ ϯʹଇͬͱΕΔ
SNS ΞΧϯτͰҾ͖ܧ͗ • ࠓճɺҾ͖ܧ͗ͷཧܗΛݕ౼ͨ͠ • ڞ௨ج൫γεςϜΛ͏͚ͩͰձࣾͱͯ͠ ཧܗͱߟ͑ΔҾ͖ܧ͗ॲཧΛಋೖͰ͖Δ • ίετͰߴ͍ϢʔβʔମݧΛఏڙͰ͖Δ
ࠓޙʹ͍ͭͯ
• ೝূ • ՝ۚ • νϟοτ • Push ௨ •
૬ޓૹ٬ • ͳͲͳͲ ͜ͷลΛਐΊ͍͖͍ͯͨ
• ೝূ • ՝ۚ • νϟοτ • Push ௨ •
૬ޓૹ٬ • ͳͲͳͲ ͪ͜Βʹؔͯ͠ ػೳՃͷ ཁ͕Ͱ͍ͯΔ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠