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
会社説明資料
persolserverworks
0
9.7k
Execution in the Kingdom of Agents: Reflections on Abstraction and Complexity
bcantrill
0
910
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
290
Jetson Orin Nanoとk3sとローカルLLMで音声文字起こしシステム作ってみた
y_sera15
0
120
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
320
Datadog の学び方 - あるいは、オブザーバビリティを学ぶとは何か
mananyuki
1
540
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
830
おそらく日本で唯一のDevRelインターン生として
husengs7
0
170
More Freedom on the Same Shared GPU Cluster: A Small Team’s Experience with vCluster
nttcom
0
150
無理せず続ける、子育てエンジニアの学び
codmoninc
PRO
0
650
Snapshot Testing in Practice: Predictable and Reliable SwiftUI Views
fespinoza
0
180
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
1
780
Featured
See All Featured
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.3k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
920
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
The untapped power of vector embeddings
frankvandijk
2
1.9k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
580
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
430
Technical Leadership for Architectural Decision Making
baasie
3
600
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 ௨ •
૬ޓૹ٬ • ͳͲͳͲ ͪ͜Βʹؔͯ͠ ػೳՃͷ ཁ͕Ͱ͍ͯΔ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠