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
570
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
JJUG CCC 2025 Fall バッチ性能!!劇的ビフォーアフター
hayashiyuu1
1
390
なぜブラウザで帳票を生成したいのか どのようにブラウザで帳票を生成するのか
yagisanreports
0
150
SRE視点で振り返るメルカリのアーキテクチャ変遷と普遍的な考え
foostan
2
430
Greenは本当にGreenか? - B/GデプロイとAPI自動テストで安心デプロイ
kaz29
0
120
ZOZOTOWNカート決済リプレイス ── モジュラモノリスという過渡期戦略
zozotech
PRO
0
500
入社したばかりでもできる、 アクセシビリティ改善の第一歩
unachang113
2
340
大規模モノレポの秩序管理 失速しない多言語化フロントエンドの運用 / JSConf JP 2025
shoota
0
290
AIを前提に、業務を”再構築”せよ IVRyの9ヶ月にわたる挑戦と未来の働き方 (BTCONJP2025)
yueda256
1
800
LINEスキマニ/LINEバイトにおけるバックエンド開発
lycorptech_jp
PRO
0
340
Redux → Recoil → Zustand → useSyncExternalStore: 状態管理の10年とReact本来の姿
zozotech
PRO
21
8.9k
スタートアップの事業成長を支えるアーキテクチャとエンジニアリング
doragt
1
5.2k
「データ無い! 腹立つ! 推論する!」から 「データ無い! 腹立つ! データを作る」へ チームでデータを作り、育てられるようにするまで / How can we create, use, and maintain data ourselves?
moznion
8
5k
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
680
What's in a price? How to price your products and services
michaelherold
246
12k
How STYLIGHT went responsive
nonsquared
100
5.9k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
GraphQLとの向き合い方2022年版
quramy
49
14k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
11
940
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
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になれる