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
Golangで学ぶHot deployの仕組み
Search
tsurubee
June 28, 2018
Programming
2
1.2k
Golangで学ぶHot deployの仕組み
Server::Starterの仕組みを学び、Golangでミニマムで 実装してみた
tsurubee
June 28, 2018
Tweet
Share
More Decks by tsurubee
See All by tsurubee
DeepCrysTet: A Deep Learning Approach Using Tetrahedral Mesh for Predicting Properties of Crystalline Materials
tsurubee
0
780
3次元メッシュで表現した結晶構造を用いた材料物性の予測に向けた深層学習モデルの設計 / Design of Deep Learning Model for Predicting Material Properties Using Crystal Structure Represented by Three-Dimensional Mesh
tsurubee
1
2k
分散システムの性能異常に対する機械学習の解釈性に基づく原因診断手法 / A Method for Diagnosing the Causes of Performance Issues in Distributed Systems Based on the Interpretability of Machine Learning
tsurubee
0
1.3k
機械学習の解釈性に関する研究動向とシステム運用への応用 / A Survey on Interpretable Machine Learning and Its Application for System Operation
tsurubee
0
310
機械学習モデルの局所的な解釈に着目したシステムにおける異常の原因診断手法の構想
tsurubee
0
7.8k
アニーリングマシンを活用したエッジAIにおける 生成モデルの学習効率化のためのアーキテクチャ
tsurubee
0
1.4k
さくらインターネット研究所で研究に再挑戦した私の半年間の取り組み
tsurubee
1
2.8k
さくらインターネット研究所と鶴田の取り組みのご紹介
tsurubee
0
110
sshr: ユーザに変更を要求せずにシステム変化に追従可能なSSHプロキシサーバ
tsurubee
3
3k
Other Decks in Programming
See All in Programming
BEエンジニアがFEの業務をできるようになるまでにやったこと
yoshida_ryushin
0
200
선언형 UI에서의 상태관리
l2hyunwoo
0
270
Alba: Why, How and What's So Interesting
okuramasafumi
0
210
return文におけるstd::moveについて
onihusube
1
1.4k
ESLintプラグインを使用してCDKのセオリーを適用する
yamanashi_ren01
2
240
テストコード書いてみませんか?
onopon
2
340
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
870
ErdMap: Thinking about a map for Rails applications
makicamel
1
660
AppRouterを用いた大規模サービス開発におけるディレクトリ構成の変遷と問題点
eiganken
1
450
知られざるDMMデータエンジニアの生態 〜かつてツチノコと呼ばれし者〜
takaha4k
1
450
2025.01.17_Sansan × DMM.swift
riofujimon
2
560
Androidアプリのモジュール分割における:x:commonを考える
okuzawats
1
280
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
335
57k
Code Reviewing Like a Champion
maltzj
521
39k
Docker and Python
trallard
43
3.2k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
YesSQL, Process and Tooling at Scale
rocio
170
14k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Testing 201, or: Great Expectations
jmmastey
41
7.2k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Become a Pro
speakerdeck
PRO
26
5.1k
Transcript
!UTVSVCFF(.01FQBCP *OD भΠϯϑϥަྲྀษڧձ ,JYT 7PM (PMBOHͰֶͿ )PUEFQMPZͷΈ
(.0ϖύϘɹΠϯϑϥΤϯδχΞ !UTVSVCFF
݄(.0ϖύϘೖࣾ ΠϯϑϥΤϯδχΞྺϲ݄
࣍ w)PUEFQMPZͱʁͳͥඞཁ͔ʁ w)PUEFQMPZͷΈ w(PMBOHͰ࣮ͯ͠Έͨ
͍͑ͨ͜ͱ wμϯλΠϜθϩΛࢧ͑Δ)PUEFQMPZͷΈͷҰྫ w(PMBOHΛ௨ͯ͡ϨΠϠʔͷٕज़ΛֶͿ͜ͱͰɺ ΤϯδχΞͱͯ͠ͷ෯͕͕ΔͷͰʁ wٕज़ॻಡΜͰ;Ή;Ή͢ΔΑΓ࣮ͯ͠Έͨํ͕ཧղ ͍͢͠
)PUEFQMPZͱʁ ͳͥඞཁ͔ʁ
)PUEFQMPZͱʁ wΞϓϦέʔγϣϯʹϩδοΫઃఆͷมߋΛՃ͑ͨࡍ ʹɺϦΫΤετͷॲཧΛଓ͚ଓ͚ͳ͕Βɺมߋͷ༰Λ ө͢ΔͨΊͷखஈ
)PUEFQMPZͱʁ wΞϓϦέʔγϣϯʹϩδοΫઃఆͷมߋΛՃ͑ͨࡍ ʹɺϦΫΤετͷॲཧΛଓ͚ଓ͚ͳ͕Βɺมߋͷ༰Λ ө͢ΔͨΊͷखஈ ҰൠతͳσϓϩΠʢ/05)PUEFQMPZʣ 4PVSDFDPEF DIBOHF (PMBOHͷ߹ɺ όΠφϦͷ্ॻ͖
)PUEFQMPZͱʁ wΞϓϦέʔγϣϯʹϩδοΫઃఆͷมߋΛՃ͑ͨࡍ ʹɺϦΫΤετͷॲཧΛଓ͚ଓ͚ͳ͕Βɺมߋͷ༰Λ ө͢ΔͨΊͷखஈ ҰൠతͳσϓϩΠʢ/05)PUEFQMPZʣ 4PVSDFDPEF DIBOHF "QQMJDBUJPO 4UPQ (PMBOHͷ߹ɺ
όΠφϦͷ্ॻ͖
)PUEFQMPZͱʁ wΞϓϦέʔγϣϯʹϩδοΫઃఆͷมߋΛՃ͑ͨࡍ ʹɺϦΫΤετͷॲཧΛଓ͚ଓ͚ͳ͕Βɺมߋͷ༰Λ ө͢ΔͨΊͷखஈ ҰൠతͳσϓϩΠʢ/05)PUEFQMPZʣ 4PVSDFDPEF DIBOHF "QQMJDBUJPO 4UPQ "QQMJDBUJPO
4UBSU (PMBOHͷ߹ɺ όΠφϦͷ্ॻ͖ ࠶ىಈ
)PUEFQMPZͱʁ wΞϓϦέʔγϣϯʹϩδοΫઃఆͷมߋΛՃ͑ͨࡍ ʹɺϦΫΤετͷॲཧΛଓ͚ଓ͚ͳ͕Βɺมߋͷ༰Λ ө͢ΔͨΊͷखஈ ҰൠతͳσϓϩΠʢ/05)PUEFQMPZʣ 4PVSDFDPEF DIBOHF "QQMJDBUJPO 4UPQ "QQMJDBUJPO
4UBSU (PMBOHͷ߹ɺ όΠφϦͷ্ॻ͖ ϦΫΤετΛॲཧ Ͱ͖ͳ͍͕࣌ؒൃੜ ࠶ىಈ
)PUEFQMPZ͕ͳͥඞཁ͔ʁ wΘ͔ͣͳؒͰՔಇ͍ͯ͠ΔαʔϏεΛࢭΊͨ͘ͳ͍ w)PUEFQMPZΛಋೖ͢Δ͜ͱͰɺγεςϜӡ༻ʹ͓͚Δ อकੑ্͕͠ɺਝͳ։ൃαΠΫϧ͕࣮ݱͰ͖Δ
)PUEFQMPZͷΈ
4FSWFS4UBSUFS w؆୯ʹ)PUEFQMPZͰ͖ΔΑ͏ʹ͢ΔͨΊͷDQBONPEVMF w1FSMͰ࣮͞Ε͍ͯΔ͕ɺγάφϧͱڥมΛͬͨ ൚༻ੑͷߴ͍ΈͷͨΊɺ͞·͟·ͳݴޠͰར༻Մೳ
4FSWFS4UBSUFS w؆୯ʹ)PUEFQMPZͰ͖ΔΑ͏ʹ͢ΔͨΊͷDQBONPEVMF w1FSMͰ࣮͞Ε͍ͯΔ͕ɺγάφϧͱڥมΛͬͨ ൚༻ੑͷߴ͍ΈͷͨΊɺ͞·͟·ͳݴޠͰར༻Մೳ ಈ࡞Λݴ༿Ͱઆ໌͢Δͱɾɾ ʮ৽͍͠ϓϩηεΛىಈͯ͠৽͍͠ϦΫΤετΛͦͪΒʹ ྲྀͭͭ͠ɺݹ͍ϓϩηεͷϦΫΤετ͕ྃͨ͠Βਖ਼͘͠ ऴྃͤ͞Δʯ
4FSWFS4UBSUFS w؆୯ʹ)PUEFQMPZͰ͖ΔΑ͏ʹ͢ΔͨΊͷDQBONPEVMF w1FSMͰ࣮͞Ε͍ͯΔ͕ɺγάφϧͱڥมΛͬͨ ൚༻ੑͷߴ͍ΈͷͨΊɺ͞·͟·ͳݴޠͰར༻Մೳ ಈ࡞Λݴ༿Ͱઆ໌͢Δͱɾɾ ʮ৽͍͠ϓϩηεΛىಈͯ͠৽͍͠ϦΫΤετΛͦͪΒʹ ྲྀͭͭ͠ɺݹ͍ϓϩηεͷϦΫΤετ͕ྃͨ͠Βਖ਼͘͠ ऴྃͤ͞Δʯ (SBDFGVM3FTUBSUʢ༏խͳ࠶ىಈʣ
)PUEFQMPZͷΈʢ؆қ൛ʣ TUBSU@TFSWFS 1BSFOU start_server —-port 8888 —- ./server TFSWFS $IJME
TPDLFU GPSLFYFD TPDLFUΛڞ༗ BDDFQU TUBSU@TFSWFSɿ(SBDFGVMSFTUBSUͷͨΊͷϓϩάϥϜ TFSWFSɿ࣮ߦ͍ͨ͠ϓϩάϥϜ
)PUEFQMPZͷΈʢ؆қ൛ʣ TUBSU@TFSWFS 1BSFOU start_server —-port 8888 —- ./server TFSWFS $IJME
TPDLFU GPSLFYFD TPDLFUΛڞ༗ BDDFQU TUBSU@TFSWFSɿ(SBDFGVMSFTUBSUͷͨΊͷϓϩάϥϜ TFSWFSɿ࣮ߦ͍ͨ͠ϓϩάϥϜ ᶃϓϩάϥϜʹมߋʂ
)PUEFQMPZͷΈʢ؆қ൛ʣ kill -HUP <master pid> TPDLFU BDDFQU TUBSU@TFSWFS 1BSFOU TFSWFS
$IJME TUBSU@TFSWFSɿ(SBDFGVMSFTUBSUͷͨΊͷϓϩάϥϜ TFSWFSɿ࣮ߦ͍ͨ͠ϓϩάϥϜ ᶄ4*()61 ᶃϓϩάϥϜʹมߋʂ
)PUEFQMPZͷΈʢ؆қ൛ʣ kill -HUP <master pid> TPDLFU GPSLFYFD TFSWFS $IJME ᶄ4*()61
BDDFQU BDDFQU TUBSU@TFSWFS 1BSFOU TFSWFS $IJME ᶅ৽ϓϩάϥϜͰىಈ ᶃϓϩάϥϜʹมߋʂ
)PUEFQMPZͷΈʢ؆қ൛ʣ kill -HUP <master pid> TPDLFU ऴྃ͢Δલʹʜ ᶃ৽نϦΫΤεड ɹͷఀࢭ ᶄݱࡏॲཧதͷ
ϦΫΤετͷྃ GPSLFYFD (SBDFGVM4IVUEPXO BDDFQU BDDFQU TUBSU@TFSWFS 1BSFOU TFSWFS $IJME ᶅ৽ϓϩάϥϜͰىಈ ᶄ4*()61 ᶆ4*(5&3. TFSWFS $IJME ᶃϓϩάϥϜʹมߋʂ
)PUEFQMPZͷΈʢ؆қ൛ʣ TUBSU@TFSWFS 1BSFOU kill -HUP <master pid> TPDLFU GPSLFYFD TFSWFS
$IJME BDDFQU ᶆ4*(5&3. ᶅ৽ϓϩάϥϜͰىಈ ᶄ4*()61 TFSWFS $IJME ᶃϓϩάϥϜʹมߋʂ ऴྃ͢Δલʹʜ ᶃ৽نϦΫΤεड ɹͷఀࢭ ᶄݱࡏॲཧதͷ ϦΫΤετͷྃ (SBDFGVM4IVUEPXO
࣮ͯ͠Έͨ
ϛχϚϜͰ࣮ͯ͠Έͨ IUUQTHJUIVCDPNUTVSVCFFHSBDFGVMSFTUBSUHP
࣮ϙΠϯτ̍ʙγάφϧϋϯυϥ func waitSignal(l net.Listener) { c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGTERM) go func() { sig := <-c switch sig { case syscall.SIGTERM: signal.Stop(c) l.Close() } }() } γάφϧͱϓϩηεؒ௨৴ͷҰछ ϓϩηεʹγάφϧΛૹ৴͢Δͱɺͦͷϓϩηεͷਖ਼ৗॲཧʹׂΓࠐΜͰɺ γάφϧݻ༗ͷॲཧΛ࣮ߦͰ͖Δ ͓खܰʹγάφϧͷϋϯυϦϯά͕ Ͱ͖Δ
࣮ϙΠϯτ̍ʙγάφϧϋϯυϥ func waitSignal(l net.Listener) { c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGTERM) go func() { sig := <-c switch sig { case syscall.SIGTERM: signal.Stop(c) l.Close() } }() } γάφϧͱϓϩηεؒ௨৴ͷҰछ ϓϩηεʹγάφϧΛૹ৴͢Δͱɺͦͷϓϩηεͷਖ਼ৗॲཧʹׂΓࠐΜͰɺ γάφϧݻ༗ͷॲཧΛ࣮ߦͰ͖Δ HPSPVUJOFͰγάφϧΛͪड͚Δ ͓खܰʹγάφϧͷϋϯυϦϯά͕ Ͱ͖Δ
࣮ϙΠϯτ̎ʙϑΝΠϧσΟεΫϦϓλ func forkExec(l *net.TCPListener) (*os.Process, error) { progName, _ :=
exec.LookPath(os.Args[0]) pwd, _ := os.Getwd() f, _ := l.File() defer f.Close() files := []*os.File{os.Stdin, os.Stdout, os.Stderr, f} fdEnv := fmt.Sprintf("%s=%d", "FD_KEY", len(files)-1) return os.StartProcess(progName, os.Args, &os.ProcAttr{ Dir: pwd, Env: append(os.Environ(), fdEnv), Files: files, }) } ϑΝΠϧσΟεΫϓϦΫλɺϑΝΠϧιέοτͳͲΛநԽͨ͠Έ ϓϩηεΛGPSLͨ͠ࡍɺϓϩηεͷϑΝΠϧσΟεΫϦϓλΛҾ͖ܧ͙
·ͱΊ w4FSWFS4UBSUFSͷΈΛֶͼɺ(PMBOHͰϛχϚϜͰ ࣮ͯ͠Έͨ wγάφϧϑΝΠϧσΟεΫϦϓλͱ͍ͬͨ֓೦ٕज़ॻΛಡ ΜͰ;Ή;Ή͢ΔΑΓɺ࣮ͯ͠Έͨ΄͏͕ཧղ͔ͬͨ͢͠ w(PMBOHଟ͘ͷ04ͷػೳΛ؆ܿͳίʔυͰѻ͑ΔͨΊɺ ࣗͷؔ৺ྖҬΛΑΓ͍ϨΠϠʔʹ͍͛ͯͨ͘Ίʹ దͨ͠ݴޠͩ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂʂ