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
え、こんなに早く改修できるの?──新人エンジニアとスクラムマスターの2人が語る、AI×アジャイル開発の現場
ysasago
1
160
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.1k
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
220
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
160
2026-09-11 【Snowflake World Tour Tokyo 2026】Snowflakeを起点に、AI Agentが自律稼働し続ける未来へ / Driving AI Agents with Snowflake
civitaspo
0
670
AI時代、データエンジニアが一番おもろい
genshun9
0
650
What the customer really needed
kawaguti
PRO
3
200
リアーキテクチャ後の障害ゼロを目指したShadow Testingの取り組み
nihonbuson
PRO
1
110
作品が生態系になった ─ Mini Tokyo 3D から世界へ
nagix
0
190
【技術的負債conf】事業成長に伴う技術的負債の説明責任とAIによるモニタリング、認知的負債について
i35_267
3
1.7k
DEFCON34-Write-up_HYCu-MYCu
daikiokazaki
0
160
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
3
2.2k
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Mind Mapping
helmedeiros
1
360
Building AI with AI
inesmontani
PRO
1
1.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Building Applications with DynamoDB
mza
96
7.2k
Balancing Empowerment & Direction
lara
6
1.3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
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 ௨ •
૬ޓૹ٬ • ͳͲͳͲ ͪ͜Βʹؔͯ͠ ػೳՃͷ ཁ͕Ͱ͍ͯΔ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠