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
540
P3インスタンスではじめるDeep Learningと画像レコメンド
dmmlabo
2
3.3k
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
「守る」から「進化させる」セキュリティへ ~AWS re:Inforce 2025参加報告~ / AWS re:Inforce 2025 Participation Report
yuj1osm
1
140
Yahoo!ニュースにおけるソフトウェア開発
lycorptech_jp
PRO
0
390
kintone開発チームの紹介
cybozuinsideout
PRO
0
73k
DuckDB-Wasmを使って ブラウザ上でRDBMSを動かす
hacusk
1
110
帳票Vibe Coding
terurou
0
140
ZOZOTOWNフロントエンドにおけるディレクトリの分割戦略
zozotech
PRO
18
5.5k
Goss: Faiss向けの新しい本番環境対応 Goバインディング #coefl_go_jp
bengo4com
0
1.4k
事業価値と Engineering
recruitengineers
PRO
3
1.1k
開発と脆弱性と脆弱性診断についての話
su3158
1
1.1k
ソフトウェア エンジニアとしての 姿勢と心構え
recruitengineers
PRO
8
2k
Goss: New Production-Ready Go Binding for Faiss #coefl_go_jp
bengo4com
0
1.1k
Webアクセシビリティ入門
recruitengineers
PRO
2
470
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
173
14k
A Tale of Four Properties
chriscoyier
160
23k
For a Future-Friendly Web
brad_frost
179
9.9k
How STYLIGHT went responsive
nonsquared
100
5.7k
Become a Pro
speakerdeck
PRO
29
5.5k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
480
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
Rails Girls Zürich Keynote
gr2m
95
14k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Optimizing for Happiness
mojombo
379
70k
GraphQLとの向き合い方2022年版
quramy
49
14k
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になれる