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
1000万ダウンロードアプリ『メルカリ』を支える技術
Search
Tatsuhiko Kubo
February 07, 2015
Technology
55k
78
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
1000万ダウンロードアプリ『メルカリ』を支える技術
dots. Summit 2015
Tatsuhiko Kubo
February 07, 2015
More Decks by Tatsuhiko Kubo
See All by Tatsuhiko Kubo
Diff algorithm abstraction in Go
cubicdaiya
0
42
Mackerel in さくらのクラウド
cubicdaiya
1
1.1k
Handling a tremendous amount of images with Fastly / Yamagoya Traverse 2020
cubicdaiya
2
1.6k
System Integration with Fastly
cubicdaiya
0
700
実例で学ぶ画像最適化集 with ImageFlux / ImageFlux meetup#2
cubicdaiya
4
20k
Software Engineer, Infrastructure
cubicdaiya
4
3.3k
High Performance Count Up!
cubicdaiya
0
440
ImageFluxを利用した画像配信の最適化 / ImageFlux meetup 201801
cubicdaiya
0
3.2k
Building high performance push notification server in Go
cubicdaiya
5
3.5k
Other Decks in Technology
See All in Technology
freeeにおける AI を用いた ブラウザ動作確認の自動化の取り組み
freee
PRO
0
220
顧客価値を追いかけたら、プライシングにたどり着いた
sansantech
PRO
2
1k
生成AI時代、PMは事業責任者に進化するともっと面白い〜PMだからこそ事業構造を動かせる時代に〜
kakehashi
PRO
0
870
クラウドサインを止めずに Nuxt へ 次の10年のために先に決めたこと
bengo4com
1
160
アカウント統制の健康診断
kenichinakamura
1
200
[FECONF-2026] 신대륙을 향한 카카오페이증권 프론트엔드 항해기 (이주승)
l1ghthouse
0
210
AI秘書と毎日働くのはもう当たり前。開発以外の業務に足りない機能をどう埋める?
minorun365
PRO
2
1.7k
プロダクトが成長すると、 プロダクトマネージャーの仕事はどう変わるのか - 「まず作る」から「小さく学び、確かめながら進む」へ
sansantech
PRO
1
370
「作れる」と「リリースできる」の間にあったもの── PdMを外して見えた、PdMがやるべき仕事/Buildable ≠ Shippable: What Removing the PM Taught Me About the PM’s Job
yappli_developers
0
280
あなたのDartコードは丸見えかもしれない ~reFlutterで暴くFlutterアプリの中身と多層防御~
zozotech
PRO
0
170
FinOps Agentが生んだ技術負債:コスト自動調査の落とし穴と解消までの道のり
oasis1994liveforever
3
300
局所最適は悪ではない。壊れているのは指標です。量と質を同時に見る先行指標の設計
recruitengineers
PRO
2
1.2k
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
490
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.8k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.6k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
630
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Producing Creativity
orderedlist
PRO
348
41k
Test your architecture with Archunit
thirion
2
2.5k
Tell your own story through comics
letsgokoyo
1
1.1k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Transcript
1000ສμϯϩʔυΞϓϦ ʰϝϧΧϦʱ Λࢧ͑Δٕज़ גࣜձࣾϝϧΧϦ ΤϯδχΞ ٱอୡ
[email protected]
dots. summit 2015
ࣗݾհ • ٱอୡ(bokko) • @cubicdaiya • Software Engineer in Infrastructure
Engineering • OSS Contributor • e.g. nginx, mruby, ngx_mruby, ngx_lua, h2o, etc…
ʰϝϧΧϦʱʹ͍ͭͯ
None
ओཁKPIσʔλ μϯϩʔυ ߪೖֹۚ ग़ 1000ສDLಥഁ ݄ؒेԯԁ 1ेສҎ্ ΞϓϦΛެ։͔ͯ͠Β1ͱͰ 1000ສμϯϩʔυୡʂ(20137݄ެ։)
None
ʰϝϧΧϦʱΛࢧ͑Δ̋̋
τϐοΫ • ϝϧΧϦΛࢧ͑Δ։ൃମ੍ • ϝϧΧϦΛࢧ͑ΔΠϯϑϥ • ϝϧΧϦΛࢧ͑ΔαϒγεςϜ • ϝϧΧϦΛࢧ͑ΔGo
τϐοΫ • ϝϧΧϦΛࢧ͑Δ։ൃମ੍ • ϝϧΧϦΛࢧ͑ΔΠϯϑϥ • ϝϧΧϦΛࢧ͑ΔαϒγεςϜ • ϝϧΧϦΛࢧ͑ΔGo
ʰϝϧΧϦʱΛࢧ͑Δ։ൃମ੍ • ΤϯδχΞ20ਓ(QAɺCS෦͋Δ) • ΠϯϑϥνʔϜؚࣗΊͯ5ਓ • ৭ΜͳόοΫΤϯυΛ࣋ͭΤϯδχΞ͕ू·ͬͯ·͢ • Ϛωʔδϟ৬্ڃΤϯδχΞ৬͋Γ·͕͢ɺϑϥοτͳ งғؾͰ͢
ʰϝϧΧϦʱΛࢧ͑Δ։ൃମ੍ • Github্ͰPull Requestϕʔεͷ։ൃ • RedmineͰλεΫཧ • Slackϑϧ׆༻
ʰϝϧΧϦʱΛࢧ͑Δ։ൃମ੍ • Qiita:TeamͰυΩϡϝϯτڞ༗ • Travis-CIʹΑΔܧଓతΠϯςάϨʔγϣϯ • Ansible PlaybookʹΑΔϓϩϏδϣχϯά • DockerʹΑΔݸਓ։ൃڥ(Vagrantͷਓ͍·͢)
τϐοΫ • ϝϧΧϦΛࢧ͑Δ։ൃମ੍ • ϝϧΧϦΛࢧ͑ΔΠϯϑϥ • ϝϧΧϦΛࢧ͑ΔαϒγεςϜ • ϝϧΧϦΛࢧ͑ΔPHP •
ϝϧΧϦΛࢧ͑ΔGo
ʰϝϧΧϦʱΛࢧ͑ΔΠϯϑϥ • ͘͞Βͷઐ༻αʔό • ͘͞ΒΫϥυ • Amazon Web Service •
Google Cloud Platform • Treasure Data • etc…
ʰϝϧΧϦʱΛࢧ͑ΔΠϯϑϥ • αʔό100Ҏ্ • ΞϓϦJP൛ͱUS൛͕͋Δ • JP൛͘͞ΒɺUS൛AWS্Ͱӡ༻ • ࡢͷޙ͔ΒJP൛͘͞Βͷઐ༻αʔό͕ϝΠϯ •
ioDriveͬͯ·͢
τϐοΫ • ϝϧΧϦΛࢧ͑Δ։ൃମ੍ • ϝϧΧϦΛࢧ͑ΔΠϯϑϥ • ϝϧΧϦΛࢧ͑ΔαϒγεςϜ • ϝϧΧϦΛࢧ͑ΔGo
େࡶͳશମ૾
શ෦͓͑͢ΔͷແཧͳͷͰ ͍͔ͭ͘հ͍͖ͯ͠·͢
ϩʔυόϥϯαʔ
OHJOY
nginx • APIϦΫΤετͷϩʔυόϥϯε • SSLλʔϛωʔγϣϯ & SPDYήʔτΣΠ • ίϯςϯπΩϟογϡ
HTTPS௨৴ͷߴԽ • TLS Session Cache • TLS Session Tickets •
SPDY
TLS Session Cache • TLSϋϯυγΣΠΫͷηογϣϯใΛαʔόʹ Ωϟογϡ • nginxͰڞ༗ϝϞϦ্ʹΩϟογϡ͞ΕΔ • ࣍ճͷTLSϋϯυγΣΠΫΛলུ
• CPUϦιʔεͷݮϨΠςϯγղফͷޮՌ͕͋Δ
TLS Session Cache with nginx
TLS Session Tickets • ҉߸Խͨ͠ηογϣϯใ(νέοτ)ΛΫϥ ΠΞϯτʹ͢ • νέοτΛݩʹTLSηογϣϯΛ࠶։ • HTTPSαʔόෳͰηογϣϯΩϟογϡ
Λڞ༗Ͱ͖Δ • αϙʔτ͍ͯ͠Δ͕গͳ͍ͷ͕
TLS Session Tickets with nginx
SPDY • WebΛߴԽ͢ΔͨΊͷϓϩτίϧ • nginx-1.5.10Ҏ߱ͰSPDY3.1͕ར༻Մ • ࠷৽ͷiOSAndroidͰαʔό͕ରԠͯ͠ ͍ΕࣗಈతʹSPDY͕ར༻͞ΕΔ
SPDY with nginx
άϥϑͰݟΔ࠷దԽͷޮՌ 5-44FTTJPO $BDIFc5JDLFUT ಋೖλΠϛϯά
άϥϑͰݟΔ࠷దԽͷޮՌ 5-44FTTJPO $BDIFc5JDLFUT ಋೖλΠϛϯά
άϥϑͰݟΔ࠷దԽͷޮՌ 41%:ಋೖͨ͠ͷϐʔΫ
"1*αʔό
"QBDIF NPE@QIQ
Apache + mod_php • ϝϧΧϦͷதͰҰ൪ٕज़తʹރΕͨίϯϙʔωϯτ • DietCakeͱ͍͏ܰྔͰߴͳϑϨʔϜϫʔΫΛར༻ • ฏۉϨεϙϯελΠϜ͕ϐʔΫ࣌Ͱ100msલޙ •
APIαʔό΄ͱΜͲϘτϧωοΫʹͳ͍ͬͯͳ͍
σʔλετΞ
.Z42- 3FEJT NFNDBDIFE 4PMS -VDFOF
ϝϧΧϦΛࢧ͑ΔσʔλετΞ • MySQL • αʔϏεͷίΞσʔλ֨ೲॴ • αʔϏεͷن֦େʹ͍ਫฏׂ͕Μ • Redisɺmemcached •
ΞϓϦέʔγϣϯΩϟογϡϨΠϠʔ • Solr(Lucene) • ݕࡧ
ඇಉظॲཧͷͨΊͷ ΩϡʔͱδϣϒϫʔΧʔ
2. QIQ1BSBMMFM1SFGPSL
ॏ͍ॲཧ2.ʹΤϯΩϡʔͯ͠ඇಉظͰ࣮ߦ
PHP-Paralle-Prefork • PHPͷpreforkσʔϞϯϑϨʔϜϫʔΫ • ฐࣾͷαʔόαΠυΤϯδχΞ͕։ൃ • ϓϩηε୯ҐͰλεΫΛฒྻ࣮ߦ • Q4M͔ΒσΩϡʔͨ͠λεΫΛฒྻ࣮ߦ͍ͯ͠Δ •
PHPͰ͜͜·ͰͰ͖Δʂ
ϩάσʔλੳج൫
None
ΞΫηεϩάΞϓϦέʔγϣϯͷϩάΛ 'MVFOUEόονͰ֤ॴʹసૹ
ϝϧΧϦΛࢧ͑Δ ϩά&σʔλੳج൫ ίϯϙʔωϯτ ༻్ 'MVFOUE ֤छϩάసૹ 5SFBTVSFEBUB #JH2VFSZ σʔλੳ 4
ϩάͷόοΫΞοϓ ,JCBOB &MBTUJDTFBSDI ۙͷϩάσʔλͷ౷ܭΛνΣοΫ /PSJLSB ϦΞϧλΠϜͰσʔλूܭɾࢹ
τϐοΫ • ϝϧΧϦΛࢧ͑Δ։ൃମ੍ • ϝϧΧϦΛࢧ͑ΔΠϯϑϥ • ϝϧΧϦΛࢧ͑ΔαϒγεςϜ • ϝϧΧϦΛࢧ͑ΔGo
ʰϝϧΧϦʱΛࢧ͑ΔGo • PHPͷΠϝʔδ͕ڧ͍ฐࣾͰ͕͢ɺRubyNodeɺ Goͱ͍ͬͨݴޠར༻͍ͯ͠·͢ • ࠷ۙPerlʹΑΔϞχλϦϯάπʔϧ͕ՃΘΓ·ͨ͠ • ࠓճϝϧΧϦͰঃʑʹ૿͍͑ͯΔGoͷϓϩμΫτ Λհ͠·͢
ʰϝϧΧϦʱΛࢧ͑ΔGo • nginx-build • cachectl • Slackboard • ൚༻ϓογϡ௨αʔό(·ͩඇެ։)
nginx-build • nginxͷϏϧυπʔϧ • ҎԼͷ࡞ۀΛࣗಈԽ • nginxͷιʔείʔυͷμϯϩʔυ • ґଘϥΠϒϥϦ3rd PartyϞδϡʔϧͷΈࠐΈ
• nginxͷRPM࡞࣌ʹར༻͍ͯ͠Δ • https://github.com/cubicdaiya/nginx-build
nginx-buildͰnginxΛϏϧυ
cachectl • OSͷϖʔδΩϟογϡ੍ޚπʔϧ • ಛఆͷϑΝΠϧͷϖʔδΩϟογϡͷར༻ঢ়گͷ֬ೝ ϖʔδΩϟογϡͷআ͕Ͱ͖Δ • ϖʔδΩϟογϡΛআ͢ΔσʔϞϯ(cachectld)͕ଐ • APIαʔόͷڊେͳϩάϑΝΠϧΛϖʔδΩϟογϡ͔
Βఆظతʹ͍ग़͢ͷʹར༻͍ͯ͠Δ(εϫοϓରࡦ) • https://github.com/cubicdaiya/cachectl
cachectldͷઃఆͱىಈ
APIαʔόʹcachectldΛ ಋೖͨ݁͠Ռɺ "1*αʔό͕εϫοϓ͠ͳ͘ͳͬͨ DBDIFDUMEΛىಈͨ͠λΠϛϯά
Slackboard • SlackϓϩΩγαʔό • SlackͷHook URLνϟϯωϧͷใΛҰݩཧ&λά͚ • Slackͷઃఆ͕֤αʔόʹࢄ͢ΔͷΛ͙ • ྡͷ੮ͷਓᐌ͘ʮ͋͋ɺikachanΈ͍ͨͳͭͶʯ
• ikachanΒͳ͔ͬͨ… • https://github.com/cubicdaiya/slackboard
4MBDLͷઃఆTMBDLCPBSEαʔόͰҰݩཧ
खൈ͖γϯϓϧͳWeb UI ҰମԿετϥοϓͳΜͩɾɾɾ
൚༻ϓογϡ௨αʔό • HTTPϕʔεͷγϯϓϧͳAPIͱेͳϞχλϦϯάػೳ • ेͳύϑΥʔϚϯε(ઍʙສQPS) • δϟʔφϧϩάʹΑΔΫϥογϡϦΧόϦʔػೳ • ࣌ؒͰेສ݅ͷϓογϡ௨Λߦ͏͜ͱ͕Ͱ͖Δ •
ઌʑि͋ͨΓ͔Βຊ൪Քಇத • ͍͍Ͷɺίϝϯτɺߪೖͷϓογϡ௨ɺetc… • ͏ͪΐͬͱ࣮ੵΜͩΒOSSԽ͍ͨ͠
൚༻ϓογϡ௨γεςϜͷΞʔΩςΫνϟ PS CBUDIαʔό
HTTP API "1* ղઆ 1045QVTI ϓογϡ௨ϦΫΤετड (&5TUBUHP (PϥϯλΠϜͷ׆ಈঢ়گΛऔಘ (&5TUBUBQQ ෦Ωϡʔ
νϟωϧ ͷ༻ྔ ϓογϡͷޭࣦഊͷऔಘ (&5DPOpHBQQ αʔόઃఆ 50.- Λऔಘ
POST /pushͷϦΫΤετϘσΟ
GET /stat/go $ curl -s http://127.0.0.1:1056/stat/go { "time": 1423270089195474419, "go_version":
"go1.4", "go_os": "linux", "go_arch": "amd64", "cpu_num": 24, "goroutine_num": 55, "gomaxprocs": 24, "cgo_call_num": 124016, "memory_alloc": 10309424, "memory_total_alloc": 295474683712, "memory_sys": 25557240, "memory_lookups": 214058, "memory_mallocs": 2118264299, "memory_frees": 2118230111, ・ ・ ・
GET /stat/app $ curl -s http://127.0.0.1:1056/stat/app { "queue_max": 40960, //
内部キューのサイズ "queue_usage": 0, // 内部キューの使用量(すぐ捌けるので大体0) "ios": { "push_success": 31804, // iOSプッシュ通知の成功数 "push_error": 17 // iOSプッシュ通知の失敗数 }, "android": { "push_success": 18683, // Androidプッシュ通知の成功数 "push_error": 233 // Androidプッシュ通知の失敗数 } $
GoΛબ͢Δཧ༝ • ύϑΥʔϚϯε͕ྑͯ͘ੜ࢈ੑ͕ߴ͍ • ͲͷϓϩμΫτ࣌ؒͰ࠷ॳͷόʔδϣϯΛॻ͍ͨ • ࣮ߦϑΝΠϧ͕୯ҰόΠφϦͳͷͰཧָ͕ • ฒྻॲཧ͕؆୯ʹॻ͚Δ •
PHPͷऑ͍෦Λ͏·͘ิͰ͖Δ
·ͱΊ • ϝϧΧϦμϯϩʔυ1000ສΛӽ͑ΔਓؾϑϦϚΞϓϦ • ͘͞ΒAWSͷΠϯϑϥΫϥυαʔϏεͷ্ ʹߏங͞Ε͍ͯΔ • ֤αϒγεςϜׂΓͱΦʔιυοΫε • ݴޠPHP͚ͩͰͳ͘GoNodeɺෳͷݴޠΛঢ়
گʹԠ͍͚ͯͯ͡·͢
ਓࡐืूதʂ