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 UY HPSN%# 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 UY HPSN%# 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 UY HPSN%# 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 UY HPSN%# 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 UY HPSN%# 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 UY HPSN%# 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になれる