Slide 1

Slide 1 text

5ヶ月でプロダクション にGoを導入したお話 DMM.com Labo システム本部

Slide 2

Slide 2 text

Agenda • 作ったプロダクトの概要 • なぜGoを選んだか? • 各コンポーネントの詳細 • テストについて • まとめ

Slide 3

Slide 3 text

対象者 • Goに興味はあるけどまだ触ったことがない方 • 新規開発でGoを利用しようと考えている方 • Gopherってなんかかわいい!と思う方

Slide 4

Slide 4 text

What we create ?

Slide 5

Slide 5 text

Segment Platform !

Slide 6

Slide 6 text

Segment Platform Consumer DB MPP DWH AMQP API ビッグデータを用いて任意のユーザーを抽出

Slide 7

Slide 7 text

Segment Platform Consumer DB MPP DWH AMQP API リクエストをAPIで受け付け SQLを生成 API ビッグデータを用いて任意のユーザーを抽出

Slide 8

Slide 8 text

Segment Platform Consumer DB MPP DWH AMQP API DB AMQP API - キューにMessageをPublish - 処理開始レコード登録 ビッグデータを用いて任意のユーザーを抽出

Slide 9

Slide 9 text

Segment Platform Consumer DB MPP DWH AMQP API DaemonがMessageをConsume ビッグデータを用いて任意のユーザーを抽出

Slide 10

Slide 10 text

Segment Platform Consumer DB MPP DWH AMQP API SQL(Create table as select 〜) を実行 ビッグデータを用いて任意のユーザーを抽出

Slide 11

Slide 11 text

Segment Platform Consumer DB MPP DWH AMQP API PrestoにてDWHから抽出し、DB の一時テーブルへ書き出し ビッグデータを用いて任意のユーザーを抽出

Slide 12

Slide 12 text

Segment Platform Consumer DB MPP DWH AMQP API 進捗状況を非同期に更新 ビッグデータを用いて任意のユーザーを抽出

Slide 13

Slide 13 text

Docker Swarm Segment Platform Consumer DB MPP DWH AMQP API / AMQP / Consumerを Dockerコンテナ内で起動 API ビッグデータを用いて任意のユーザーを抽出

Slide 14

Slide 14 text

Segment Platform Consumer DB MPP DWH AMQP API

Slide 15

Slide 15 text

What we choose ?

Slide 16

Slide 16 text

新しい言語を使ってみたい! • 静的型付け言語 • 採用事例が増えている ➡ Goが良さそう!

Slide 17

Slide 17 text

ナウい開発をしたい • ORMapper使いたい • 煩雑な処理を自動化したい • テストデータも管理したい • Packageのバージョン管理したい

Slide 18

Slide 18 text

選定基準 • GithubのStar数 • メンテナンスされているか? を総合的に見て選定

Slide 19

Slide 19 text

ナウい開発をしたい • ORMapper使いたい - Gorm • 煩雑な処理を自動化したい - Godo • テストデータも管理したい - Fixture • Packageのバージョン管理したい- Glide

Slide 20

Slide 20 text

Gorm

Slide 21

Slide 21 text

Gorm • ORM • ポリモフィックリレーションを利用して、 権限周りの管理を実現している • マイグレーションの機能として不十分 ➡ 現状、利用はしていない

Slide 22

Slide 22 text

Godo

Slide 23

Slide 23 text

Godo • タスクランナー (他言語でいうrakeとかgulp) • 実際に定義しているタスク • ソースの変更を検知 →コンパイル & サーバ再起動 • Godoc生成 & サーバ起動 • ユニットテスト実行

Slide 24

Slide 24 text

Fixture

Slide 25

Slide 25 text

Fixtureとは ? • DB用テストデータをymlで定義 • テスト実行時に、DBへデータをインサート EJNFOTJPOTZNM JE EJTQ@OBNFTBNQMFEJNFOTJPO CJHJOU GVODUJPO EJNFOTJPO@UZQFCJHJOU BMMPX@PQFSBUPST CFUXFFO EFTDSJQUJPOTBNQMFEJNFOTJPO FOBCMF@GMH

Slide 26

Slide 26 text

Glide

Slide 27

Slide 27 text

Goにおけるパッケージ • Goのパッケージは$GOPATH以下に入る ➡ バージョン指定・管理ができない • 基本的に全て最新のものになる ➡ バグが発生して困るシーンも… ★ パッケージのバージョン管理したい

Slide 28

Slide 28 text

Glideについて • Masterminds/glide • glide.ymlで、パッケージ管理 • バージョン指定が可能 • 依存関係 • RubyでいうGemfile、JSでいうpackage.json

Slide 29

Slide 29 text

How to use

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

2. glide get 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

Slide 32

Slide 32 text

Vendoring SPPU!HPQIFSHPTSDBQQUSFF-$ ]HMJEFMPDL⇰ᘻᣪӘԹԫԙդԠӘԸդԠՏ՛Ә༾ᇰҶҿӶӵ ]HMJEFZBNMHMJEFԛՆ՛ԱӕӲӴ⇰ᘻ ]NBJOHP AWFOEPSȒWFOEPS㌔टӑԊԿՒԙդԟՏ՛ӕᒨ⺙ӔԹԫԙդԠӼ☛ⅈ AHJUIVCDPN AOMPQFT ATMBDL AFUD

Slide 33

Slide 33 text

ハマりどころ

Slide 34

Slide 34 text

Glideによるパッケージ管理 • 社内のソースは基本的にBitbucket上にある • Bitbucket上のパッケージもGlideで管理した いが、単純にはできない • git configでhttps -> git protocolに変更 HJUDPOGJHHMPCBMVSMHJU!CJUCVDLFUYYYDPNJOTUFBE0G IUUQTCJUCVDLFUYYYDPN

Slide 35

Slide 35 text

• glide.ymlにWDTHJUを指定してパッケージ を追記。vendor配下のパスになる。 • repoには、git cloneする時のURLを指定でパ ッケージ管理できるように! Glideによるパッケージ管理 QBDLBHFCJUCVDLFUYYYDPNTBNQMF JNQPSU QBDLBHFCJUCVDLFUYYYDPNTBNQMFTBNQMFDPSF WDTHJU SFQPTTIHJU!CJUCVDLFUYYYDPN999TBNQMFTBNQMFDPSFHJU

Slide 36

Slide 36 text

Glideのバグ… • HMJEFVQでキャッシュが悪さをしてしま い、パッケージのバージョンがあがらない ➡ HMJEFDDでcacheを消去してHMJEFVQ するとバージョンがあがる • https://github.com/Masterminds/glide/ issues/592

Slide 37

Slide 37 text

Glideのバグ… • HMJEFVQQBDLBHFൻで特定のパッ ケージだけをアップデートできない ➡ 全パッケージがアップデートされてしまう

Slide 38

Slide 38 text

Segment Platform Consumer DB MPP DWH AMQP API

Slide 39

Slide 39 text

API

Slide 40

Slide 40 text

API • RESTfulなAPIをシンプルに作りたい ➡Echoを採用

Slide 41

Slide 41 text

Slide 42

Slide 42 text

About Echo • labstack/echo • 軽量・高速なフレームワーク ➡ RESTful APIを作りたいならオススメ • 非常に活発に開発されている ➡ v2系を利用中

Slide 43

Slide 43 text

ディレクトリ構成 SPPU!HPQIFSHPTSDTBNQMFBQJUSFF-$ ](PEPEJSԧԡԗՑ՛ԲդHPEPӘԯԋՔԗ԰Ւ ]BQJ൵FOEQPJOUӘԯԋՔԗ԰Ւ ]DPNNPOஈ㉊௡ⅈ ]DPOG⼀ᇰԽԉԌՓ ]GJYUVSFԮԡ԰ԯդԧ ]HMJEFMPDL ]HMJEFZBNM7FOEPSJOHԬդՓǒHMJEFӘQBDLBHF☛ⅈԽԉԌՓ ]NBJOHP ]NJEEMFXBSF⽇⼊௡ⅈӔӓ஁SFRVFTUӕሽӁӐᇴᢇӃӵஈ㉊௡ⅈ ]SPVUFS"1*ӘՓդԮԋ՛Ԙ AWFOEPSਜ⇹QBDLBHFӼ☛ⅈӃӵԯԋՔԗ԰Ւ

Slide 44

Slide 44 text

Vendoring (api) QBDLBHFCJUCVDLFUYYYDPNTBNQMFTBNQMFBQJ JNQPSU QBDLBHFHJUIVCDPNMBCTUBDLFDIP WFSTJPO? TVCQBDLBHFT FOHJOFTUBOEBSE QBDLBHFCJUCVDLFUYYYDPNTBNQMFTBNQMFDPSF TVCQBDLBHFT NPEFMTTBNQMF WDTHJU SFQPTTIHJU!CJUCVDLFUYYYDPN999TBNQMFTBNQMFDPSFHJU EFW*NQPSU QBDLBHFHJUIVCDPNHPUFTUGJYUVSFTUFTUGJYUVSFT

Slide 45

Slide 45 text

工夫した点 1. Package common 2. Using `json:"omitempty"` 3. Transaction

Slide 46

Slide 46 text

1. Package Common SPPU!HPQIFSHPTSDTBNQMFBQQUSFF-$ BQJ ]BQJHP ]SFTPVSDFHP ]SFTPVSDFHP package内の共通処理を集約

Slide 47

Slide 47 text

1. Package Common BQJHP QBDLBHFBQJ HMPCBMႁᡔ WBS DPOGJHDPNNPO(FU$POGJH MPHHFSDPNNPO(FU-PHHFS BQQ ஈ㉊௡ⅈ GVODDPNNPO'VOD \ ^ package内の共通変数や関数を定義 ←private (※小文字始まり)

Slide 48

Slide 48 text

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()を使用

Slide 49

Slide 49 text

2. Using `json:"omitempty"` UZQF$PMMFDUJPO3FTVMUTUSVDU\ $PVOUJOUAKTPODPVOUA -JTU<>*UFNAKTPOMJTUA /FYU63-TUSJOHAKTPOOFYU@VSM PNJUFNQUZA ^ UZQF*UFNTUSVDU\ *%JOUAKTPOJEA /BNFTUSJOHAKTPOOBNFA ^ JSONレスポンスに不要な要素を含めない

Slide 50

Slide 50 text

\ TUBUVT EBUB\ DPVOU MJTU< \ JE OBNFQIQ ^ > ^ OFYU@VSM ^ 2. Using `json:"omitempty"` \ TUBUVT EBUB\ DPVOU MJTU< \ JE OBNFQIQ ^ > ^ ^ omitempty not omitempty JSONレスポンスに不要な要素を含めない

Slide 51

Slide 51 text

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 UYHPSN%# FSSPST<>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^

Slide 52

Slide 52 text

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 UYHPSN%# FSSPST<>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^

Slide 53

Slide 53 text

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 UYHPSN%# FSSPST<>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^ defer 関数からreturn時の処理を予約

Slide 54

Slide 54 text

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 UYHPSN%# FSSPST<>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^ transactionを開始し、deferにて 終了処理を呼び出し

Slide 55

Slide 55 text

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 UYHPSN%# FSSPST<>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^ err有無に応じて commit or rollbackを切り替え

Slide 56

Slide 56 text

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 UYHPSN%# FSSPST<>FSSPS \ JGMFO FSSPST \ UY3PMMCBDL ^FMTF\ UY$PNNJU ^ ^ 以降の処理では、 transactionを意識しないコード

Slide 57

Slide 57 text

Segment Platform Consumer DB MPP DWH AMQP API

Slide 58

Slide 58 text

Consumer

Slide 59

Slide 59 text

Consumer • AMQPをConsumeして処理を行うDaemon • Graceful Shutdown • SIGHUP / 管理channel • Proxy経由でのアクセス • 処理状況の非同期更新

Slide 60

Slide 60 text

Vendoring (Consumer) QBDLBHFCJUCVDLFUYYYDPNTBNQMFDPOTVNFS JNQPSU QBDLBHFCJUCVDLFUYYYDPNTBNQMFTBNQMFDPSF WDTHJU SFQPTTIHJU!CJUCVDLFUYYYDPN999TBNQMFTBNQMFDPSFHJU GPSLUPTBNQMFDPOTVNFSQSFTUP QBDLBHFHJUIVCDPNDPMJONBSDHPQSFTUP model/logなどの共通処理は coreライブラリに集約し、 apiと共用

Slide 61

Slide 61 text

工夫した点 1. Graceful shutdown 2. Access via proxy

Slide 62

Slide 62 text

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 ^

Slide 63

Slide 63 text

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 ^

Slide 64

Slide 64 text

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Λར༻

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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を無限ループで 待ち受ける

Slide 67

Slide 67 text

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しない)

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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開始

Slide 70

Slide 70 text

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になるまで同期

Slide 71

Slide 71 text

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 ^ 処理終了

Slide 72

Slide 72 text

2. Access via proxy JNQPSU GNU OFUIUUQ QSPYZ63- FSSVSM1BSTF GNU4QSJOUG IUUQTT QPSU IPTU IUUQ%FGBVMU5SBOTQPSUIUUQ5SBOTQPSU\1SPYZ IUUQ1SPYZ63- QSPYZ63- ^ defaultTransportにProxyURLを セットし、全てのアクセスを proxy経由にする

Slide 73

Slide 73 text

Unit testing

Slide 74

Slide 74 text

CI flow

Slide 75

Slide 75 text

Test automation • CIはJenkinsで • 下記パッケージで実現 • gocov + gocov-xml + go-junit-report • テスト実行時には、テストのためのコンテナ を立てて毎回クリーンな状態にしている

Slide 76

Slide 76 text

How to Unit test? • gocovを利用し、テスト & カバレッジ取得 • 開発時は、gocov + gocov-htmlを使って、ブ ラウザからカバレッジレポートを閲覧

Slide 77

Slide 77 text

最後にまとめ

Slide 78

Slide 78 text

辛かったところ… • Goのprivateな変数/関数 ➡ package内の他のソースからアクセス可能 • Glide × 社内Bitbucket × Jenkinsがツラい ➡ Glide × Github EP × Circle CIにしたい…

Slide 79

Slide 79 text

よかったところ! • ワンバイナリでデプロイできる • 静的型付け言語としてはカジュアルに書ける • はじめてでもできる • 誰でもGopherになれる