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.5k
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
600
P3インスタンスではじめるDeep Learningと画像レコメンド
dmmlabo
2
3.5k
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
ECS_EKS以外の選択肢_ROSA入門_.pdf
masakiokuda
1
120
国井さんにPurview の話を聞く会
sophiakunii
1
290
Eight Engineering Unit 紹介資料
sansan33
PRO
0
6.1k
「駆動」って言葉、なんかカッコイイ_Mitz
comucal
PRO
0
130
ルネサンス開発者を育てる 1on1支援AIエージェント
yusukeshimizu
0
130
AI: The stuff that nobody shows you
jnunemaker
PRO
1
150
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
Oracle Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
2
660
Data Hubグループ 紹介資料
sansan33
PRO
0
2.5k
AI との良い付き合い方を僕らは誰も知らない (WSS 2026 静岡版)
asei
1
200
Scrum Guide Expansion Pack が示す現代プロダクト開発への補完的視点
sonjin
0
300
20251225_たのしい出張報告&IgniteRecap!
ponponmikankan
0
110
Featured
See All Featured
BBQ
matthewcrist
89
9.9k
What does AI have to do with Human Rights?
axbom
PRO
0
1.9k
Building AI with AI
inesmontani
PRO
1
610
Heart Work Chapter 1 - Part 1
lfama
PRO
3
35k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
110
How STYLIGHT went responsive
nonsquared
100
6k
What's in a price? How to price your products and services
michaelherold
246
13k
Site-Speed That Sticks
csswizardry
13
1k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
410
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.3k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
92
Build your cross-platform service in a week with App Engine
jlugia
234
18k
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になれる