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
ISUCONにRustで挑戦した話 / Participating in ISUCON wi...
Search
すてにゃん
October 20, 2020
Programming
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ISUCONにRustで挑戦した話 / Participating in ISUCON with Rust
https://forcia.connpass.com/event/187287/
に向けた発表資料です。
すてにゃん
October 20, 2020
More Decks by すてにゃん
See All by すてにゃん
GitHub Copilot CLI の Rubber Duck 機能を使ってコーディングの品質をあげよう #techbaton_findy
stefafafan
2
1.3k
サプライチェーン攻撃への備えについて考えている #湘なんか
stefafafan
3
2.6k
サービスの信頼性を高めるため、形骸化した「プロダクションミーティング」を立て直すまでの取り組み
stefafafan
1
330
「お金で解決」が全てではない!大規模WebアプリのCI高速化 #phperkaigi
stefafafan
6
2.9k
急成長を支える基盤作り〜地道な改善からコツコツと〜 #cre_meetup
stefafafan
0
4.6k
小田原でみんなで一句詠みたいな #phpcon_odawara
stefafafan
0
2k
dotfiles について話したい #湘なんか
stefafafan
2
510
意義から考えるObservability入門 #srenext
stefafafan
2
1.6k
高橋メソッド風の発表を生成するCLIツールをPHPで作った #phpcon_odawara
stefafafan
1
1.6k
Other Decks in Programming
See All in Programming
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
190
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
740
LLM Plugin for Node-REDの利用方法と開発について
404background
0
160
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
200
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.9k
Oxlintのカスタムルールの現況
syumai
6
1k
Claspは野良GASの夢をみるか
takter00
0
180
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.8k
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
320
RTSPクライアントを自作してみた話
simotin13
0
520
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
520
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
Featured
See All Featured
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
What's in a price? How to price your products and services
michaelherold
247
13k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
580
For a Future-Friendly Web
brad_frost
183
10k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
140
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
940
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Evolving SEO for Evolving Search Engines
ryanjones
0
210
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Transcript
ISUCONʹRustͰઓͨ͠ RustͷLTձ Shinjuku.rs #12 @ΦϯϥΠϯ https://forcia.connpass.com/event/187287/ 2020/10/20 ͯ͢ʹΌΜ (id:stefafafan)
࣍ • ࣗݾհ • ISUCONͱʁ • ࣄલ४උௐͨRustͷCrateͷհ • ISUCON༧બ •
ֶͼɾײͳͲ 2
ࣗݾհ • ͯ͢ʹΌΜ (id:stefafafan) • גࣜձࣾͯͳͷࣾһ • WebΞϓϦέʔγϣϯΤϯδχΞ • Rustॳ৺ऀ
• ISUCON10Trust RustνʔϜͱͯ͠ࢀՃ
ISUCONͱʁ
ISUCONͱ • LINEגࣜձࣾओ࠵ʮIikanjini Speed Up ContestʯͷུশͰ͋Γɺ༩͑ ΒΕͨWebΞϓϦέʔγϣϯΛߴԽ͠ڝ͍߹͏ίϯςετ • 1ਓʙ3ਓͷνʔϜͰࢀՃ͢Δ͜ͱ͕Ͱ͖ͯɺΞϓϦέʔγϣϯίʔυ ͷΈͳΒͣྫ͑nginxMySQLͷνϡʔχϯάͳͲߦ͏͜ͱʹͳ
Δ • ༻ҙ͞ΕͨϕϯνϚʔΫΛ࣮ߦ͢Δ͜ͱʹΑͬͯʮʯ͕֬ೝͰ͖ Δ
ISUCONͱ • ࣾձਓֶੜࢀՃՄೳ • ܾউ্ҐʹೖΔͱۚ͋Δ ※ʮISUCONʯɺLINEגࣜձࣾͷඪ·ͨొඪͰ͢ɻ http://isucon.net/
༧બग़·Ͱͷ४උ
༧બग़·Ͱͷ४උ • νʔϜ࡞Γͱׂ୲ܾΊ • nginxMySQLͷϩάղੳɾνϡʔχϯά • Rustͷษڧ • WebΞϓϦέʔγϣϯͱRust
༧બग़·Ͱͷ४උ • νʔϜ࡞Γͱׂ୲ܾΊˡࠓճ͞ͳ͍ • nginxMySQLͷϩάղੳɾνϡʔχϯάˡࠓճ͞ͳ͍ • RustͷษڧˡTour of RustΓ·ͨ͠ (https://tourofrust.com/)
• WebΞϓϦέʔγϣϯͱRust
WebΞϓϦέʔγϣϯͱRust
ISUCONͷࢀߟ࣮ʹ͍ͭͯ • ISUCONͰԿछྨ͔ͷݴޠͰͷ࣮͕ఏڙ͞Ε্ͨͰڝٕ͕ߦΘΕ Δ • ॳզʑRustͷࢀߟ࣮͕ͳ͍έʔεߟྀ͠ɺ1͔ΒRustͰΞϓ ϦέʔγϣϯΛ࣮͢Δ͜ͱݕ౼ʹೖΕ͍ͯͨ • RustͰWebΞϓϦέʔγϣϯΛ࡞ΔͷʹඞཁͳϥΠϒϥϦͳͲΛ ͓ͬͯ͘ඞཁ͕͋Δ
WebΞϓϦέʔγϣϯΛRustͰهड़͢ΔͷʹԿ ͕ඞཁͳͷ͔ • WebϑϨʔϜϫʔΫ͕΄͍͠ • ςϯϓϨʔτΤϯδϯ͕΄͍͠ • APIୟ͍ͨΓ͢ΔͳΒHTTPΫϥΠΞϯτ͕΄͍͠ • JSONฦ͢ͳΒSerialize/DeserializeͰ͖ΔΑ͏ʹ͍ͨ͠
• MySQLPostgreSQLΫϥΠΞϯτ͕΄͍͠
WebΞϓϦέʔγϣϯΛRustͰهड़͢ΔͷʹԿ ͕ඞཁͳͷ͔ • WebϑϨʔϜϫʔΫ͕΄͍͠ • ςϯϓϨʔτΤϯδϯ͕΄͍͠ • APIୟ͍ͨΓ͢ΔͳΒHTTPΫϥΠΞϯτ͕΄͍͠ • JSONฦ͢ͳΒSerialize/DeserializeͰ͖ΔΑ͏ʹ͍ͨ͠
• MySQLPostgreSQLΫϥΠΞϯτ͕΄͍͠
actix-web use actix_web::{web, App, HttpResponse, HttpServer}; // ϢʔβҰཡΛදࣔ͢Δ async fn
show_users() -> HttpResponse { HttpResponse::Ok().body(“Show users…”) } // ΤϯυϙΠϯτ͝ͱʹͲͷؔΛݺͿ͔ͳͲ͜͜Ͱهड़͢Δ #[actix_rt::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| { App::new().service( web::scope(“/users”) .route(“/show”, web::get().to(show_users)), ) }) .bind(“127.0.0.1:8088”)? .run() .await } RustͷWeb framework https://github.com/actix/ actix-web
actix-web READMEʹػೳҰཡ Example͕͍͔ͭ͘ࡌͬͯ ͍Δ
WebΞϓϦέʔγϣϯΛRustͰهड़͢ΔͷʹԿ ͕ඞཁͳͷ͔ • WebϑϨʔϜϫʔΫ͕΄͍͠ • ςϯϓϨʔτΤϯδϯ͕΄͍͠ • APIୟ͍ͨΓ͢ΔͳΒHTTPΫϥΠΞϯτ͕΄͍͠ • JSONฦ͢ͳΒSerialize/DeserializeͰ͖ΔΑ͏ʹ͍ͨ͠
• MySQLPostgreSQLΫϥΠΞϯτ͕΄͍͠
Tera <h2>My Programming Languages</h2> <ul> {% for language in programming_languages
%} {% if language.name == “rust” %} <li>Rust Rules!!!!</li> {% else %} <li>{{ language.name }}</li> {% endif %} {% endfor %} </ul> … Template engine inspired by Jinja2 https://github.com/Keats/ tera
WebΞϓϦέʔγϣϯΛRustͰهड़͢ΔͷʹԿ ͕ඞཁͳͷ͔ • WebϑϨʔϜϫʔΫ͕΄͍͠ • ςϯϓϨʔτΤϯδϯ͕΄͍͠ • APIୟ͍ͨΓ͢ΔͳΒHTTPΫϥΠΞϯτ͕΄͍͠ • JSONฦ͢ͳΒSerialize/DeserializeͰ͖ΔΑ͏ʹ͍ͨ͠
• MySQLPostgreSQLΫϥΠΞϯτ͕΄͍͠
reqwest let client = reqwest::Client::new(); // form()ͷଞʹbody()ͱ͔json()ͱ͔͑Δ let res =
client.post(“https://…”) .form(¶ms) .send() .await?; RustͷHTTPΫϥΠΞϯτ https://github.com/ seanmonstar/reqwest
WebΞϓϦέʔγϣϯΛRustͰهड़͢ΔͷʹԿ ͕ඞཁͳͷ͔ • WebϑϨʔϜϫʔΫ͕΄͍͠ • ςϯϓϨʔτΤϯδϯ͕΄͍͠ • APIୟ͍ͨΓ͢ΔͳΒHTTPΫϥΠΞϯτ͕΄͍͠ • JSONฦ͢ͳΒSerialize/DeserializeͰ͖ΔΑ͏ʹ͍ͨ͠
• MySQLPostgreSQLΫϥΠΞϯτ͕΄͍͠
serde use actix_web::{HttpResponse, Responder}; use serve::{Serialize, Deserialize}; #[derive(Serialize, Deserialize)] struct
User { id: i32, username: String, name: String } async fn user_detail_json() -> imp Responder { let user = User { id: 12345, username: “stefafafan”.to_string(), name: “ͯ͢ʹΌΜ”.to_string(), } // ͜Εactix_webͷ͚ؔͩͲJSONͱͯ͠ฦͤͯΔ HttpResponse::Ok().json(user) } Rust͚ʹσʔλΛSerialize/ Deserialize͢ΔϑϨʔϜϫʔΫ https://github.com/serde-rs/ serde
WebΞϓϦέʔγϣϯΛRustͰهड़͢ΔͷʹԿ ͕ඞཁͳͷ͔ • WebϑϨʔϜϫʔΫ͕΄͍͠ • ςϯϓϨʔτΤϯδϯ͕΄͍͠ • APIୟ͍ͨΓ͢ΔͳΒHTTPΫϥΠΞϯτ͕΄͍͠ • JSONฦ͢ͳΒSerialize/DeserializeͰ͖ΔΑ͏ʹ͍ͨ͠
• MySQLPostgreSQLΫϥΠΞϯτ͕΄͍͠
SQLx use sqlx::{MySqlPool}; async fn main() -> std::io::Result<()> { let
pool = MySqlPool::connect(&DATABASE_URL).await; let row = sqlx::query!(“SELECT …”) .fetch_all(&pool) .await .unwrap(); … } Rust͚SQLϥΠϒϥϦ https://github.com/ launchbadge/sqlx
ISUCON༧બ
ISUCON10 ༧બͷղઆͱߨධ http://isucon.net/archives/55025156.html
ISUCON10 ༧બ֓ཁ • Πεʹ߹͏݅Λݕࡧ͢ΔαΠτ(ISUUMO) ҎԼͷΑ͏ͳը໘͕͋Δ • Πεͷݕࡧ • ݅ͷݕࡧ •
Πεɾ݅ͷৄࡉը໘ • ϚοϓΛϚεͰͳͧͬͯൣғʹؚ·ΕΔ݅Λදࣔ
ISUCON10 ༧બ֓ཁ • MySQLͱnginx͕ΘΕ͍ͯΔ • Rust࣮͋Δ • αʔό͕3͑Δ
ISUCON༧બTrust RustνʔϜͰͬͨ͜ͱ • αʔόʹ͋ΔRustͷ࣮ΛGitཧԼʹஔ͘ • alppt-query-digestΛͬͯɺ͍ΤϯυϙΠϯτ͍ΫΤϦΛಛఆ • MySQLͷINDEXΛ͢ͳͲ • طଘͷRustίʔυΛோΊ͖ͯ͋Β͔ʹඇޮͳ͜ͱͬͯͦ͏ͳ෦Έ
͚ͭͯվળ͠Α͏ͱͨ͠ • 3αʔό͕͋ΔͷͰΞϓϦαʔό1 + DBαʔό2ߏʹ
ISUCON༧બTrust RustνʔϜͰͬͨ͜ͱ • αʔόʹ͋ΔRustͷ࣮ΛGitཧԼʹஔ͘ • alppt-query-digestΛͬͯɺ͍ΤϯυϙΠϯτ͍ΫΤϦΛಛఆ • MySQLͷINDEXΛ͢ͳͲ • طଘͷRustίʔυΛோΊ͖ͯ͋Β͔ʹඇޮͳ͜ͱͬͯͦ͏ͳ෦Έ
͚ͭͯվળ͠Α͏ͱͨ͠ • 3αʔό͕͋ΔͷͰΞϓϦαʔό1 + DBαʔό2ߏʹ
ISUCON༧બ վળྫᶃ ɾΠεͷॎԣ෯͕݅ͷυΞʹೖΔ ͔Ͳ͏͔ͷΫΤϦΛΈཱ͍ͯͯΔ Օॴͷվળ https://github.com/dekokun/ ISUCON-2020-qualify/pull/12
ISUCON༧બ վળྫᶄ ɾchairςʔϒϧͱestateςʔϒϧͰ ผʑͷMySQLPoolΛࢀর͢ΔΑ͏ ʹͯ͠ɺDBαʔόΛΘ͚ΒΕΔঢ় ଶʹ https://github.com/dekokun/ ISUCON-2020-qualify/pull/15
༧બͷ݁Ռ • զʑ༧બഊୀͨ͠ • ISUCON10 ΦϯϥΠϯ༧બͷར༻ݴޠൺ http://isucon.net/ archives/55008738.html • Goݴޠ͕1൪ਓؾͰ6ׂۙ͘ͷνʔϜ͕͍ͬͯͨ
• Rust8Ͱ͏ͪ1͕ຊઓग़ (͍͢͝)
ֶͼɾײ • RustίϯύΠϧ࣌ʹஸೡʹ৭ʑͱౖͬͯ͘ΕΔͷͰ҆৺ײ͕͋Δ • ૉૣ͘վળ͍ͯ͘͠ඞཁͷ͋ΔISUCONʹؔͯ͠ίϯύΠϧ࣌ؒίʔ υॻ࣌͘ͷखܰ͞ͱ͍͏໘ͰGo͍͍͢ͷͩΖ͏ͳͱࢥͬͨ • ࠓճͷ͏ͪͷνʔϜͷઓ͍ํΞϓϦͷίʔυΛΰϦΰϦॻ͘ͱ͍ ͏ײ͡Ͱͳ͔ͬͨͱ͍͏ͷ͋Γ·͢ •
RustΛ৮Δػձʹͳͬͨ͠ɺ༧બམͪͨͷͷͬͯΑ͔ͬͨ