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
AWS Summit の片隅で、体育座りしながらコミュニティがにぎわう理由を考えた
k_adachi_01
2
340
はてなのサービス基盤を支える Kubernetes《足腰》
masayoshimaezawa
0
430
RAGの精度向上とエージェント活用
kintotechdev
2
120
Keeping applications secure by evolving OAuth 2.0 and OpenID Connect
ahus1
PRO
1
130
“全部コピーしない”ファイルデータの活用 : — FSx for ONTAP × S3 Tables × Icebergで作るメタデータカタログ
yoshiki0705
0
320
知見・人・API・DB・予算 ─ ナイナイ尽くしだった人事データ整備 with dbt、5年間の学び
ken6377
1
140
打造你的 AI 工作流:Agent Skill + MCP 實戰工作坊
appleboy
0
450
BPaaSで進むAIオペレーションの現在地 AI実装が効く領域とスケーラビリティの選定と実装
kentarofujii
0
250
Baseline対応のDOMの型定義を作った
uhyo
2
620
“ID沼入口” - 基本とセキュリティから始める、考え続けるためのID管理技術勉強会 告知&イントロ
ritou
0
380
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
2
140
SRE歴2ヶ月でも開発6年の知見を活かして、チームで止まっていた環境改善を前に進めた話
a_ono
0
180
Featured
See All Featured
BBQ
matthewcrist
89
10k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
880
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Amusing Abliteration
ianozsvald
1
220
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
860
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Thoughts on Productivity
jonyablonski
76
5.2k
Leo the Paperboy
mayatellez
7
1.9k
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ɺෳͷݴޠΛঢ়
گʹԠ͍͚ͯͯ͡·͢
ਓࡐืूதʂ