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
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
690
実例で学ぶ画像最適化集 with ImageFlux / ImageFlux meetup#2
cubicdaiya
4
20k
Software Engineer, Infrastructure
cubicdaiya
4
3.3k
High Performance Count Up!
cubicdaiya
0
430
ImageFluxを利用した画像配信の最適化 / ImageFlux meetup 201801
cubicdaiya
0
3.2k
Building high performance push notification server in Go
cubicdaiya
5
3.5k
メルカリのデータ分析基盤 / mercari data analysis infrastructure
cubicdaiya
11
12k
Other Decks in Technology
See All in Technology
エージェントはローカル、検証はMicroVM — Lambda MicroVMsでつくるServerless CI
fujioka6789
3
390
Claude Code本って、 読む必要あるの?
oikon48
2
480
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
2
1.5k
Genieを崇めよ
kameitomohiro
0
170
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
2.3k
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
230
`t*(42&t>>10)`だけで音楽が鳴る、Swiftで実装するBytebeat / iOSDC Japan 2026
yutailang0119
0
110
SREへの勘違いに気づいた後の話
tomodakengo
0
110
EventBridge に「合流」はない ― サーバーレスのワークフローを育てるということ / No Join in EventBridge
yusukeshimizu
2
180
AI時代、データエンジニアが一番おもろい
genshun9
0
670
AIで社員の自主発信に広報目線を組み込む
_mossann_t
0
130
現場で役立つ技術負債の効果的な返済方法
masuda220
PRO
9
4.6k
Featured
See All Featured
Marketing to machines
jonoalderson
1
5.8k
KATA
mclloyd
PRO
35
15k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
A designer walks into a library…
pauljervisheath
211
25k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Chasing Engaging Ingredients in Design
codingconduct
0
320
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
340
Mobile First: as difficult as doing things right
swwweet
225
10k
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ɺෳͷݴޠΛঢ়
گʹԠ͍͚ͯͯ͡·͢
ਓࡐืूதʂ