Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
共通基盤システムの開発について
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
630
大規模 Padrino アプリケーション Rails 移行 / Migrating to Rails from Padrino
ttanimichi
0
13k
Other Decks in Technology
See All in Technology
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
690
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
0
9.7k
[モダンアプリ勉強会]今更聞けないGit/GitHub入門
tsukuboshi
0
360
10倍の生産性を実現するAI駆動並列エージェントのすべて
kumaiu
4
1.3k
やさしいA2A入門
minorun365
PRO
11
1.7k
非定型業務をAI slackbotで自動化する ~ 社内要望を自動壁打ちするbotを作った ~/automating-ad-hoc-work-with-ai-slackbot
shibayu36
0
580
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
690
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.5k
MCP Appsを作ってみよう
iwamot
PRO
4
470
新規事業を牽引する技術選定 〜フルスタックTypeScript開発の実践事例〜
nullnull
3
380
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
290
AmazonRoute 53ではじめてのドメイン取得!HTTPS化までの道のりを整理してみた
usanchuu
3
130
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Marketing to machines
jonoalderson
1
5.4k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
730
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
160
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
160
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Side Projects
sachag
455
43k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
190
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 ௨ •
૬ޓૹ٬ • ͳͲͳͲ ͪ͜Βʹؔͯ͠ ػೳՃͷ ཁ͕Ͱ͍ͯΔ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠