Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
共通基盤システムの開発について
Search
Tsukuru Tanimichi
January 27, 2016
Technology
13k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
共通基盤システムの開発について
http://aiming.connpass.com/event/25004/
での発表資料です
Tsukuru Tanimichi
January 27, 2016
More Decks by Tsukuru Tanimichi
See All by Tsukuru Tanimichi
react-rails で SPA, SSR を実現する / react-rails-spa-ssr
ttanimichi
2
1.2k
マネーフォワードにおけるウェブメディア高速化の取り組み / yamagoya2018
ttanimichi
7
2.4k
WebSocket はどれくらい通じるのかの統計 / websocket-connectivity-survey
ttanimichi
0
640
大規模 Padrino アプリケーション Rails 移行 / Migrating to Rails from Padrino
ttanimichi
0
13k
Other Decks in Technology
See All in Technology
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
0
2.6k
The Agent Builder Loop from Daily Work to OSS
minorun365
PRO
3
200
2026/09/10 Spring Bootから Jakarta EE/MicroProfileへの移行
megascus
0
370
空間オーディオで過去の 自分(ゴースト)と競うランニング 〜HealthKitのルートを足音に変える実装〜
nao_randd
0
220
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
0
2.2k
30座EKS, 180次升級淬煉的EKS Upgrade Skill 的歷程
eric8230
0
160
開発投資の期待値を上げるプロダクトロードマップづくり ~プロダクトエンジニアが越境して事業を伸ばす~
kekekenta
1
180
Reactの設計論
uhyo
24
13k
HRC_Frontend_Conference_Fukuoka_2026.pdf
ts020
0
730
omasushiというライブラリを作った
polidog
PRO
0
230
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
250
アプリをもっと"iOSアプリっぽく"する小さな工夫 / Small Touches That Make Your App Feel More Like an iOS App
matsuji
1
900
Featured
See All Featured
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Building an army of robots
kneath
307
46k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Designing Experiences People Love
moore
143
24k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
330
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Side Projects
sachag
456
43k
Exploring anti-patterns in Rails
aemeredith
4
510
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 ௨ •
૬ޓૹ٬ • ͳͲͳͲ ͪ͜Βʹؔͯ͠ ػೳՃͷ ཁ͕Ͱ͍ͯΔ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠