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
5ヶ月でプロダクションにGoを導入したお話
Search
DMM.com
October 05, 2016
Technology
2
2.4k
5ヶ月でプロダクションにGoを導入したお話
3社合同勉強会にて、Go言語を導入した事例を紹介しました。
DMM.com
October 05, 2016
Tweet
Share
More Decks by DMM.com
See All by DMM.com
Neo4j with Spark for Big Data Analysis
dmmlabo
1
560
P3インスタンスではじめるDeep Learningと画像レコメンド
dmmlabo
2
3.4k
DMM.comのサービス開発におけるGitHub Enterprise活用の舞台裏
dmmlabo
2
1k
Digdagを導入してみて
dmmlabo
9
4.1k
DMM.comラボにおける Scality Ring 活⽤事例
dmmlabo
0
1.1k
デジタルコンテンツの安定配信とコスト削減の両立を実現したシステム刷新
dmmlabo
1
2.6k
DMM CM AWAEDS におけるフロントエンド技術選定について
dmmlabo
1
1.4k
エンジニアのパフォーマンス・モチベーション管理
dmmlabo
1
1.4k
DMMに於ける技術導入はじめの一歩
dmmlabo
1
1.3k
Other Decks in Technology
See All in Technology
コンパウンド組織のCRE #cre_meetup
layerx
PRO
1
290
OTEPsで知るOpenTelemetryの未来 / Observability Conference Tokyo 2025
arthur1
0
320
DSPy入門
tomehirata
4
500
AIでデータ活用を加速させる取り組み / Leveraging AI to accelerate data utilization
okiyuki99
6
1.4k
CLIPでマルチモーダル画像検索 →とても良い
wm3
1
570
会社を支える Pythonという言語戦略 ~なぜPythonを主要言語にしているのか?~
curekoshimizu
4
900
Behind Postgres 18: The People, the Code, & the Invisible Work | Claire Giordano | PGConfEU 2025
clairegiordano
0
150
プレイドのユニークな技術とインターンのリアル
plaidtech
PRO
1
490
仕様駆動開発を実現する上流工程におけるAIエージェント活用
sergicalsix
8
3.7k
書籍『実践 Apache Iceberg』の歩き方
ishikawa_satoru
0
230
プロダクト開発と社内データ活用での、BI×AIの現在地 / Data_Findy
sansan_randd
1
620
AI機能プロジェクト炎上の 3つのしくじりと学び
nakawai
0
150
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
2.8k
Agile that works and the tools we love
rasmusluckow
331
21k
Code Reviewing Like a Champion
maltzj
526
40k
How GitHub (no longer) Works
holman
315
140k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
116
20k
A better future with KSS
kneath
239
18k
BBQ
matthewcrist
89
9.9k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Documentation Writing (for coders)
carmenintech
75
5.1k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
KATA
mclloyd
PRO
32
15k
Transcript
5ヶ月でプロダクション にGoを導入したお話 DMM.com Labo システム本部
Agenda • 作ったプロダクトの概要 • なぜGoを選んだか? • 各コンポーネントの詳細 • テストについて
• まとめ
対象者 • Goに興味はあるけどまだ触ったことがない方 • 新規開発でGoを利用しようと考えている方 • Gopherってなんかかわいい!と思う方
What we create ?
Segment Platform !
Segment Platform Consumer DB MPP DWH AMQP API
ビッグデータを用いて任意のユーザーを抽出
Segment Platform Consumer DB MPP DWH AMQP API
リクエストをAPIで受け付け SQLを生成 API ビッグデータを用いて任意のユーザーを抽出
Segment Platform Consumer DB MPP DWH AMQP API
DB AMQP API - キューにMessageをPublish - 処理開始レコード登録 ビッグデータを用いて任意のユーザーを抽出
Segment Platform Consumer DB MPP DWH AMQP API
DaemonがMessageをConsume ビッグデータを用いて任意のユーザーを抽出
Segment Platform Consumer DB MPP DWH AMQP API
SQL(Create table as select 〜) を実行 ビッグデータを用いて任意のユーザーを抽出
Segment Platform Consumer DB MPP DWH AMQP API
PrestoにてDWHから抽出し、DB の一時テーブルへ書き出し ビッグデータを用いて任意のユーザーを抽出
Segment Platform Consumer DB MPP DWH AMQP API
進捗状況を非同期に更新 ビッグデータを用いて任意のユーザーを抽出
Docker Swarm Segment Platform Consumer DB MPP DWH
AMQP API / AMQP / Consumerを Dockerコンテナ内で起動 API ビッグデータを用いて任意のユーザーを抽出
Segment Platform Consumer DB MPP DWH AMQP API
What we choose ?
新しい言語を使ってみたい! • 静的型付け言語 • 採用事例が増えている ➡ Goが良さそう!
ナウい開発をしたい • ORMapper使いたい • 煩雑な処理を自動化したい • テストデータも管理したい • Packageのバージョン管理したい
選定基準 • GithubのStar数 • メンテナンスされているか? を総合的に見て選定
ナウい開発をしたい • ORMapper使いたい - Gorm • 煩雑な処理を自動化したい - Godo
• テストデータも管理したい - Fixture • Packageのバージョン管理したい- Glide
Gorm
Gorm • ORM • ポリモフィックリレーションを利用して、 権限周りの管理を実現している • マイグレーションの機能として不十分 ➡
現状、利用はしていない
Godo
Godo • タスクランナー (他言語でいうrakeとかgulp) • 実際に定義しているタスク • ソースの変更を検知 →コンパイル
& サーバ再起動 • Godoc生成 & サーバ起動 • ユニットテスト実行
Fixture
Fixtureとは ? • DB用テストデータをymlで定義 • テスト実行時に、DBへデータをインサート EJNFOTJPOTZNM
JE EJTQ@OBNFTBNQMFEJNFOTJPO CJHJOU GVODUJPO EJNFOTJPO@UZQFCJHJOU BMMPX@PQFSBUPST CFUXFFO EFTDSJQUJPOTBNQMFEJNFOTJPO FOBCMF@GMH
Glide
Goにおけるパッケージ • Goのパッケージは$GOPATH以下に入る ➡ バージョン指定・管理ができない • 基本的に全て最新のものになる ➡ バグが発生して困るシーンも…
★ パッケージのバージョン管理したい
Glideについて • Masterminds/glide • glide.ymlで、パッケージ管理 • バージョン指定が可能 • 依存関係
• RubyでいうGemfile、JSでいうpackage.json
How to use
1. glide create SPPU!HPQIFSHPTSDBQQHMJEFDSFBUF <*/'0> (FOFSBUJOHB:".-DPOGJHVSBUJPOGJMFBOEHVFTTJOHUIFEFQFOEFODJFT <*/'0> "UUFNQUJOHUPJNQPSUGSPNPUIFSQBDLBHFNBOBHFST VTFTLJQJNQPSU
UPTLJQ <*/'0> 4DBOOJOHDPEFUPMPPLGPSEFQFOEFODJFT <*/'0> 8SJUJOHDPOGJHVSBUJPOGJMF HMJEFZBNM <*/'0> 8PVMEZPVMJLF(MJEFUPIFMQZPVGJOEXBZTUPJNQSPWFZPVS HMJEFZBNMDPOGJHVSBUJPO <*/'0> *GZPVXBOUUPSFWJTJUUIJTTUFQZPVDBOVTFUIFDPOGJHXJ[BSE DPNNBOEBUBOZUJNF <*/'0> :FT : PS/P / / <*/'0> :PVDBOOPXFEJUUIFHMJEFZBNMGJMF$POTJEFS <*/'0> 6TJOHWFSTJPOTBOESBOHFT4FFIUUQTHMJEFTIEPDTWFSTJPOT <*/'0> "EEJOHBEEJUJPOBMNFUBEBUB4FFIUUQTHMJEFTIEPDT HMJEFZBNM <*/'0> 3VOOJOHUIFDPOGJHXJ[BSEDPNNBOEUPJNQSPWFUIFWFSTJPOTJO ZPVSDPOGJHVSBUJPO
2. glide get <package> SPPU!HPQIFSHPTSDBQQHMJEFHFUHJUIVCDPNOMPQFTTMBDL <*/'0> 1SFQBSJOHUPJOTUBMMQBDLBHF <*/'0> "UUFNQUJOHUPHFUQBDLBHFHJUIVCDPNOMPQFTTMBDL
<*/'0> (BUIFSJOHSFMFBTFJOGPSNBUJPOGPSHJUIVCDPNOMPQFTTMBDL <*/'0> 5IFQBDLBHFHJUIVCDPNOMPQFTTMBDLBQQFBSTUPIBWF4FNBOUJD7FSTJPO SFMFBTFT IUUQTFNWFSPSH <*/'0> 5IFMBUFTUSFMFBTFJTW:PVBSFDVSSFOUMZOPUVTJOHBSFMFBTF 8PVMEZPVMJLF <*/'0> UPVTFUIJTSFMFBTF :FT : PS/P / / <*/'0> "EEJOHHJUIVCDPNOMPQFTTMBDLUPZPVSDPOGJHVSBUJPO <*/'0> %PXOMPBEJOHEFQFOEFODJFT1MFBTFXBJU <*/'0> 'FUDIJOHHJUIVCDPNOMPQFTTMBDL <*/'0> 3FTPMWJOHJNQPSUT <*/'0> %PXOMPBEJOHEFQFOEFODJFT1MFBTFXBJU <*/'0> &YQPSUJOHSFTPMWFEEFQFOEFODJFT <*/'0> &YQPSUJOHHJUIVCDPNOMPQFTTMBDL <*/'0> 3FQMBDJOHFYJTUJOHWFOEPSEFQFOEFODJFT
Vendoring SPPU!HPQIFSHPTSDBQQUSFF-$ ]HMJEFMPDL⇰ᘻᣪӘԹԫԙդԠӘԸդԠՏ՛Ә༾ᇰҶҿӶӵ ]HMJEFZBNMHMJEFԛՆ՛ԱӕӲӴ⇰ᘻ ]NBJOHP AWFOEPSȒWFOEPS㌔टӑԊԿՒԙդԟՏ՛ӕᒨ⺙ӔԹԫԙդԠӼ☛ⅈ AHJUIVCDPN AOMPQFT
ATMBDL AFUD
ハマりどころ
Glideによるパッケージ管理 • 社内のソースは基本的にBitbucket上にある • Bitbucket上のパッケージもGlideで管理した いが、単純にはできない • git configでhttps
-> git protocolに変更 HJUDPOGJHHMPCBMVSMHJU!CJUCVDLFUYYYDPNJOTUFBE0G IUUQTCJUCVDLFUYYYDPN
• glide.ymlにWDTHJUを指定してパッケージ を追記。vendor配下のパスになる。 • repoには、git cloneする時のURLを指定でパ ッケージ管理できるように! Glideによるパッケージ管理 QBDLBHFCJUCVDLFUYYYDPNTBNQMF
JNQPSU QBDLBHFCJUCVDLFUYYYDPNTBNQMFTBNQMFDPSF WDTHJU SFQPTTIHJU!CJUCVDLFUYYYDPN999TBNQMFTBNQMFDPSFHJU
Glideのバグ… • HMJEFVQでキャッシュが悪さをしてしま い、パッケージのバージョンがあがらない ➡ HMJEFDDでcacheを消去してHMJEFVQ するとバージョンがあがる • https://github.com/Masterminds/glide/
issues/592
Glideのバグ… • HMJEFVQQBDLBHFൻで特定のパッ ケージだけをアップデートできない ➡ 全パッケージがアップデートされてしまう
Segment Platform Consumer DB MPP DWH AMQP API
API
API • RESTfulなAPIをシンプルに作りたい ➡Echoを採用
About Echo • labstack/echo • 軽量・高速なフレームワーク ➡ RESTful
APIを作りたいならオススメ • 非常に活発に開発されている ➡ v2系を利用中
ディレクトリ構成 SPPU!HPQIFSHPTSDTBNQMFBQJUSFF-$ ](PEPEJSԧԡԗՑ՛ԲդHPEPӘԯԋՔԗՒ ]BQJ൵FOEQPJOUӘԯԋՔԗՒ ]DPNNPOஈ㉊ⅈ ]DPOG⼀ᇰԽԉԌՓ ]GJYUVSFԮԡԯդԧ
]HMJEFMPDL ]HMJEFZBNM7FOEPSJOHԬդՓǒHMJEFӘQBDLBHF☛ⅈԽԉԌՓ ]NBJOHP ]NJEEMFXBSF⽇⼊ⅈӔӓSFRVFTUӕሽӁӐᇴᢇӃӵஈ㉊ⅈ ]SPVUFS"1*ӘՓդԮԋ՛Ԙ AWFOEPSਜ⇹QBDLBHFӼ☛ⅈӃӵԯԋՔԗՒ
Vendoring (api) QBDLBHFCJUCVDLFUYYYDPNTBNQMFTBNQMFBQJ JNQPSU QBDLBHFHJUIVCDPNMBCTUBDLFDIP WFSTJPO? TVCQBDLBHFT FOHJOFTUBOEBSE
QBDLBHFCJUCVDLFUYYYDPNTBNQMFTBNQMFDPSF TVCQBDLBHFT NPEFMTTBNQMF WDTHJU SFQPTTIHJU!CJUCVDLFUYYYDPN999TBNQMFTBNQMFDPSFHJU EFW*NQPSU QBDLBHFHJUIVCDPNHPUFTUGJYUVSFTUFTUGJYUVSFT
工夫した点 1. Package common 2. Using `json:"omitempty"` 3. Transaction
1. Package Common SPPU!HPQIFSHPTSDTBNQMFBQQUSFF-$ BQJ ]BQJHP ]SFTPVSDFHP ]SFTPVSDFHP
package内の共通処理を集約
1. Package Common BQJHP QBDLBHFBQJ HMPCBMႁᡔ WBS
DPOGJHDPNNPO(FU$POGJH MPHHFSDPNNPO(FU-PHHFS BQQ ஈ㉊ⅈ GVODDPNNPO'VOD \ ^ package内の共通変数や関数を定義 ←private (※小文字始まり)
1. Package Common SFTPVSDFHP QBDLBHFBQJ GVOD(FU3FTPVSDF DFDIP$POUFYU \
MPHHFS8JUI'JFMET MPHSVT'JFMET\NFUIPE NFUIPE^ %FCVH 4UBSU EFGFSGVOD \ MPHHFS8JUI'JFMET MPHSVT'JFMET\NFUIPE NFUIPE^ %FCVH &OE ^ DPNNPO'VOD ^ loggerやcommonFunc()を使用
2. Using `json:"omitempty"` UZQF$PMMFDUJPO3FTVMUTUSVDU\ $PVOUJOUAKTPODPVOUA -JTU<>*UFNAKTPOMJTUA /FYU63-TUSJOHAKTPOOFYU@VSM PNJUFNQUZA
^ UZQF*UFNTUSVDU\ *%JOUAKTPOJEA /BNFTUSJOHAKTPOOBNFA ^ JSONレスポンスに不要な要素を含めない
\ TUBUVT EBUB\ DPVOU
MJTU< \ JE OBNFQIQ ^ > ^ OFYU@VSM ^ 2. Using `json:"omitempty"` \ TUBUVT EBUB\ DPVOU MJTU< \ JE OBNFQIQ ^ > ^ ^ omitempty not omitempty JSONレスポンスに不要な要素を含めない
3. Transaction GVOD4PNF'VOD DFDIP$POUFYU FSSPS\ FSST<>FSSPS\^
UYE#FHJO EFGFSEC'JOJTI5SBOTBDUJPO UY FSST FSSTIPHF JGMFO FSST \ SFUVSOFDIP/FX)551&SSPS IUUQ4UBUVT*OUFSOBM4FSWFS&SSPS FSST<>&SSPS ^ ^ GVOD'JOJTI5SBOTBDUJPO UY HPSN%# FSSPST <>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^
GVOD4PNF'VOD DFDIP$POUFYU FSSPS\ FSST<>FSSPS\^ UYE#FHJO
EFGFSEC'JOJTI5SBOTBDUJPO UY FSST FSSTIPHF JGMFO FSST \ SFUVSOFDIP/FX)551&SSPS IUUQ4UBUVT*OUFSOBM4FSWFS&SSPS FSST<>&SSPS ^ ^ GVOD'JOJTI5SBOTBDUJPO UY HPSN%# FSSPST <>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^
GVOD4PNF'VOD DFDIP$POUFYU FSSPS\ FSST<>FSSPS\^ UYE#FHJO
EFGFSEC'JOJTI5SBOTBDUJPO UY FSST FSSTIPHF JGMFO FSST \ SFUVSOFDIP/FX)551&SSPS IUUQ4UBUVT*OUFSOBM4FSWFS&SSPS FSST<>&SSPS ^ ^ GVOD'JOJTI5SBOTBDUJPO UY HPSN%# FSSPST <>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^ defer 関数からreturn時の処理を予約
GVOD4PNF'VOD DFDIP$POUFYU FSSPS\ FSST<>FSSPS\^ UYE#FHJO
EFGFSEC'JOJTI5SBOTBDUJPO UY FSST FSSTIPHF JGMFO FSST \ SFUVSOFDIP/FX)551&SSPS IUUQ4UBUVT*OUFSOBM4FSWFS&SSPS FSST<>&SSPS ^ ^ GVOD'JOJTI5SBOTBDUJPO UY HPSN%# FSSPST <>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^ transactionを開始し、deferにて 終了処理を呼び出し
GVOD4PNF'VOD DFDIP$POUFYU FSSPS\ FSST<>FSSPS\^ UYE#FHJO
EFGFSEC'JOJTI5SBOTBDUJPO UY FSST FSSTIPHF JGMFO FSST \ SFUVSOFDIP/FX)551&SSPS IUUQ4UBUVT*OUFSOBM4FSWFS&SSPS FSST<>&SSPS ^ ^ GVOD'JOJTI5SBOTBDUJPO UY HPSN%# FSSPST <>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^ err有無に応じて commit or rollbackを切り替え
GVOD4PNF'VOD DFDIP$POUFYU FSSPS\ FSST<>FSSPS\^ UYE#FHJO
EFGFSEC'JOJTI5SBOTBDUJPO UY FSST FSSTIPHF JGMFO FSST \ SFUVSOFDIP/FX)551&SSPS IUUQ4UBUVT*OUFSOBM4FSWFS&SSPS FSST<>&SSPS ^ ^ GVOD'JOJTI5SBOTBDUJPO UY HPSN%# FSSPST <>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^ 以降の処理では、 transactionを意識しないコード
Segment Platform Consumer DB MPP DWH AMQP API
Consumer
Consumer • AMQPをConsumeして処理を行うDaemon • Graceful Shutdown • SIGHUP /
管理channel • Proxy経由でのアクセス • 処理状況の非同期更新
Vendoring (Consumer) QBDLBHFCJUCVDLFUYYYDPNTBNQMFDPOTVNFS JNQPSU QBDLBHFCJUCVDLFUYYYDPNTBNQMFTBNQMFDPSF WDTHJU SFQPTTIHJU!CJUCVDLFUYYYDPN999TBNQMFTBNQMFDPSFHJU GPSLUPTBNQMFDPOTVNFSQSFTUP
QBDLBHFHJUIVCDPNDPMJONBSDHPQSFTUP model/logなどの共通処理は coreライブラリに集約し、 apiと共用
工夫した点 1. Graceful shutdown 2. Access via proxy
1. Graceful shutdown JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \
NBJONBLF DIBOCPPM HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJOՓդԿ✳६ൺᦆ NBJO MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU MPHHFS*OGP 'JOJTIFE ^
JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \ NBJONBLF DIBOCPPM
HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJONBJOՓդԿ✳६ൺᦆ MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU XHҶӕӔӵӨӑൺᦆ MPHHFS*OGP 'JOJTIFE ^
JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \ NBJONBLF DIBOCPPM
HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJONBJOՓդԿ✳६ൺᦆ MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU XHҶӕӔӵӨӑൺᦆ MPHHFS*OGP 'JOJTIFE ^ TZODύοέʔδ 8BJU(SPVQΛར༻
JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \ NBJONBLF DIBOCPPM
HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJONBJOՓդԿ✳६ൺᦆ MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU XHҶӕӔӵӨӑൺᦆ MPHHFS*OGP 'JOJTIFE ^ main loop終了同期用channel
JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \ NBJONBLF DIBOCPPM
HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJONBJOՓդԿ✳६ൺᦆ MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU XHҶӕӔӵӨӑൺᦆ MPHHFS*OGP 'JOJTIFE ^ mainループ shutDown/deliveryを無限ループで 待ち受ける
JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \ NBJONBLF DIBOCPPM
HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJONBJOՓդԿ✳६ൺᦆ MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU XHҶӕӔӵӨӑൺᦆ MPHHFS*OGP 'JOJTIFE ^ shut down channelに入力があった場合 - mainループの同期channelに入力し終了 (以降のchannelのconsumeしない)
JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \ NBJONBLF DIBOCPPM
HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJONBJOՓդԿ✳६ൺᦆ MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU XHҶӕӔӵӨӑൺᦆ MPHHFS*OGP 'JOJTIFE ^ 通常処理channelに入力があった場合 - 開始時にAdd - go routine内でdefer done
JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \ NBJONBLF DIBOCPPM
HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJONBJOՓդԿ✳६ൺᦆ MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU XHҶӕӔӵӨӑൺᦆ MPHHFS*OGP 'JOJTIFE ^ mainループ終了同期が取れたら、 graceful shutdown開始
JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \ NBJONBLF DIBOCPPM
HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJONBJOՓդԿ✳६ൺᦆ MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU XHҶӕӔӵӨӑൺᦆ MPHHFS*OGP 'JOJTIFE ^ graceful shutdown中… wgが0になるまで同期
JNQPSUTZOD WBSXHTZOD8BJU(SPVQ GVODNBJO \ NBJONBLF DIBOCPPM
HPGVOD \ GPS\ TFMFDU\ DBTFTIVU%PXO$IBO NBJOUSVF CSFBL DBTFEEFMJWFSZ$IBO XH"EE HPGVOD EBNRQ%FMJWFSZ \ EFGFSXH%POF ՉԫԣդԠӘⅈ ^ ^ ^ ^ NBJONBJOՓդԿ✳६ൺᦆ MPHHFS*OGP 'JOJTIJOHDPOTVNFSHSBDFGVMMZ XH8BJU XHҶӕӔӵӨӑൺᦆ MPHHFS*OGP 'JOJTIFE ^ 処理終了
2. Access via proxy JNQPSU GNU
OFUIUUQ QSPYZ63- FSSVSM1BSTF GNU4QSJOUG IUUQTT QPSU IPTU IUUQ%FGBVMU5SBOTQPSUIUUQ5SBOTQPSU\1SPYZ IUUQ1SPYZ63- QSPYZ63- ^ defaultTransportにProxyURLを セットし、全てのアクセスを proxy経由にする
Unit testing
CI flow
Test automation • CIはJenkinsで • 下記パッケージで実現 • gocov +
gocov-xml + go-junit-report • テスト実行時には、テストのためのコンテナ を立てて毎回クリーンな状態にしている
How to Unit test? • gocovを利用し、テスト & カバレッジ取得 •
開発時は、gocov + gocov-htmlを使って、ブ ラウザからカバレッジレポートを閲覧
最後にまとめ
辛かったところ… • Goのprivateな変数/関数 ➡ package内の他のソースからアクセス可能 • Glide × 社内Bitbucket
× Jenkinsがツラい ➡ Glide × Github EP × Circle CIにしたい…
よかったところ! • ワンバイナリでデプロイできる • 静的型付け言語としてはカジュアルに書ける • はじめてでもできる • 誰でもGopherになれる