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
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
990
Handling a tremendous amount of images with Fastly / Yamagoya Traverse 2020
cubicdaiya
2
1.6k
System Integration with Fastly
cubicdaiya
0
680
実例で学ぶ画像最適化集 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.1k
Building high performance push notification server in Go
cubicdaiya
5
3.4k
メルカリのデータ分析基盤 / mercari data analysis infrastructure
cubicdaiya
11
12k
Other Decks in Technology
See All in Technology
IaC コードを資産へ:AWS CDK 社内ライブラリと横断展開 / aws-summit-japan-2026
gotok365
10
1.7k
“全部コピーしない”ファイルデータの活用 : — FSx for ONTAP × S3 Tables × Icebergで作るメタデータカタログ
yoshiki0705
0
110
なぜ人は自分のプロジェクトを 「なんちゃってアジャイル」と 自嘲するのか
kozotaira
0
210
AIエージェントとPhysical AIが拓く製造業の変革(ハノーバーメッセリキャップ)
iotcomjpadmin
0
190
勉強会企画をアプリで構造化してみた 〜そこで見えた、AIとの付き合い方〜 / I've structured a study group plan using an app.
pauli
0
220
小さいから、全部わかる。— 常駐AI "xangi" のすすめ
sugupoko
0
200
SRE歴2ヶ月でも開発6年の知見を活かして、チームで止まっていた環境改善を前に進めた話
a_ono
0
160
Agile and AI Redmine Japan 2026
hiranabe
4
560
フルAIで個人開発して学んだあれこれ / yuruai vol.1
isaoshimizu
0
160
作る力から、見極める力へ — AI時代に広がるエンジニアの価値と役割
rince
0
380
時期が悪い!それでもRaspberry Piを買って遊んで活用するには / 20260627-osc26do-rpi-jikigawarui
akkiesoft
1
950
AWS Summit の片隅で、体育座りしながらコミュニティがにぎわう理由を考えた
k_adachi_01
2
330
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
350
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
450
Product Roadmaps are Hard
iamctodd
PRO
55
12k
RailsConf 2023
tenderlove
30
1.5k
Test your architecture with Archunit
thirion
1
2.3k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
150
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
The agentic SEO stack - context over prompts
schlessera
0
830
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Ethics towards AI in product and experience design
skipperchong
2
320
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ɺෳͷݴޠΛঢ়
گʹԠ͍͚ͯͯ͡·͢
ਓࡐืूதʂ