mercari.go #9  参加レポート~預金残高管理の話、Gopherライブドローイングetc〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/965212c5-551c-4e4f-62fa-5b1dc5deb243.png)

## はじめに
こんにちは。Wano株式会社エンジニアのnariです。
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">今日はこれにきてます！<br>mercari.go #9 <a href="https://t.co/kaD9Czw6DA">https://t.co/kaD9Czw6DA</a> <a href="https://twitter.com/hashtag/mercarigo?src=hash&amp;ref_src=twsrc%5Etfw">#mercarigo</a></p>&mdash; nari@技術書典7📖 GoとAWSで作る本格slackbot (@fukubaka0825) <a href="https://twitter.com/fukubaka0825/status/1151439670846226432?ref_src=twsrc%5Etfw">July 17, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
今回は何と言っても@tottieさんによる**Gopher ライブドローイング！！！！**
それ以外の内容も素晴らしかったため、復習がてらまとめ記事を書かせていただきます。

## タイムテーブル
19:40 〜19:45	@tottie	Gopher ライブドローイングのご説明
19:45 ~ 20:00	@rerorero	protoactor-goでPregelを作った話
20:00 ~ 20:05		休憩
20:05 ~ 20:35	@knsh14	メルペイでの残高管理の話
20:35 ~ 20:40		休憩
20:40 ~ 20:55	@akkie	Readable code in Go
20:55 ~ 21:10	@tenntenn	The Go Playgroundをコマンドラインから扱う
21:10 ~ 21:20	@tottie	Gopher イラスト発表
21:20 ~ 22:00	懇親会
	
## @tottie	Gopher ライブドローイングのご説明
- sli.doで題材を募集
- 普段はtottieさんはUI/UXデザイナーやっている
- LINEスタンプを作る(gopher)のためにGoを学んだ(凄い..)
- ボツ案とLINEスタンプの裏話をたくさんしていただけた
- **tottieさんのLINEスタンプは以下のnoteの記事のリンクから買えます！** 僕はもちろん全種類買いました！！めちゃ可愛い  
[GopherさんのLINEスタンプが完成しました！｜とってぃ｜note](https://note.mu/tottie/n/n4d3eecf90756)
- **私はドラム叩くgopherくんを依頼してみました**

<img width="978" alt="スクリーンショット 2019-07-17 19.46.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/2304b4f4-62f7-572c-6390-c260f4836aeb.png">


## @rerorero	protoactor-goでPregelを作った話
- **[GitHub - rerorero/prerogel: Go implementation of Google's Pregel](https://github.com/rerorero/prerogel)の概要説明**
- どう作るか
  - 分散システム　ワーカー、パーティション、ノードそれぞれステートマシーンが必要
- アクターモデル
  - 並行計算モデル
- GOにはchannelがあるのに必要？
  - 一箇所で管理したい　整合性が重要
- チャットサーバーやゲームサーバーなどがユースケース
- [GitHub - AsynkronIT/protoactor-go: Proto Actor - Ultra fast distributed actors for Go, C# and Java/Kotlin](https://github.com/AsynkronIT/protoactor-go)を使って実装
- **let it crach** 
  -  Erlangからきている とにかくクラッシュ
  -  親がこのクラッシュを検知してリカバリーを試みる
- **スーパーバイザーストラテジー**
  - .Netでもprotoactore-go は使える
- **Goでアクターモデル使いたいなら、protoactor-go一択**

### 感想
- **アクターモデルの存在を恥ずかしながら初めて知った、、**
- [マイクロサービスにも使われている「アクターモデル」による並列処理プログラミング入門 – SIOS Tech. Lab](https://tech-lab.sios.jp/archives/8738)をとりあえず読んで概念を抑えた
- 排他制御に悩まされずスケールできて良さそう
- akkaというフレームワークがよく使われるようなので、どこかで使って見たい
- とりあえずprotoactor-goを読むのが良さそう

## @knsh14	メルペイでの残高管理の話
- **全体設計**
  - Go gRPC GKE Google Cloud Spannerなどなどメルカリ標準
  - クリーンアーキテクチャベース
    - Viewはない
- **トランザクションの貼り方**
  - usecaseそうのinteractorでspannerのトランザクションを張っている
  - ビジネスロジックを持たせているので、処理全体のロールバックがしやすい
- **dbについて**
  - [GitHub - mercari/yo: yo is a command-line tool to generate Go code for Google Cloud Spanner.](https://github.com/mercari/yo)でコード生成している
  - database/sqlパッケージ使ってない
- **APIの設計**
  - balance serviceでは各種の残高の増減を提供する
 - 他のサービス
   - payment service
     - 様々な決済手段を提供する
     - 決済をフェーズに分割
       - 決済受付
       - 決済成功失敗
       - 返金
     - 各フェーズでリトライやロールバックをして成功失敗
       - balanceを叩くフェーズも起こりうる
     - **全ての残高の種類を共通のインターフェースで扱いたい**
     - **どの残高の操作するときも同じように扱える**
     - 複数斬だけを処理する場合の失敗処理が楽
       - **まとめてUseCase層でロールバックできる**
  - マイクロサービスの機能を提供するときには**どんなサービスから叩かれるのかを意識するべき**
  - **冪等性を担保**するための仕組み
    - payment sercieは決済のフェーズごとにリクエストを送ってくる
      - 失敗したら再度リトライする
      -  基本的にリトライされる
       - もし冪等性がなかったら
          -  とにかくリクエストを受けると全て処理する
         -  **その取引で二十三十引いてしまうかもしれない**
    - 参照系のRPCの冪等性
         - あまり必要としない
     - 更新がかかるようなRPCの冪等性
       - 残高を消費したい
       - 途中でタイムアウトしたら
       - 叩く側のマイクロサービスがリトライしたら
       - 冪等性を担保する必要がある
        - **取引IDをチェックして処理を行う**
       - パラメータが同一の処理がすでに行われているか調べる
        - すでに取引がある場合には処理せずその結果だけ返す
   - 冪等性はサービスの信頼性を保証するためには必須
       - **balancesercie では種に取引IDで冪等性を担保している**
    - お客様の残高の追跡する方法
      - **1.取引レコードから算出する ES的な発想**
      - **2.取引後の残高のスナップショット**  
       - 操作まいにそれぞれに履歴テーブルにレコードを保存してる
      - 取引後の残高スナップショットはgit的な仕組みでID参照のチェーンで参照がつながっている
- まとめ
   - **アプリケーション設計　冪等性　お客様のデータの保存**　の話をしました
   - シンプルな機能を提供しているマイクロサービスでも**考えるポイントはたくさんある**
   
### 感想
- クリーンアーキテクチャやトランザクション管理の話は、個人的な興味領域なので非常に参考になった
- 懇親会でもかなり質問させていただきましたが、**トランザクションオブジェクトがusecase層に漏れるのは仕方がなさそうでした。。**(repositoryで完結はまず無理だし、非同期での担保ってわけでもないみたい)
- それぞれのマイクロサービスで設計思想がかなり異なるようなので、それぞれ聞いてみたくなった
- **ESとスナップショットのユースケースでの使い分けを質問し忘れた、、** これは今度聞いてみよう
- **後dto -> domainモデルの変換はdtoにメソッド生やすのが確かにいいかもと懇親会で気づきを得た。。**
- Spannerの良さは、RDBとsql構文の恩恵を受けながらスケールインアウトがイージーなとこなんだろうな そこも詳しく聞いてみたい

### 参考記事
- [マイクロサービスにおける決済トランザクション管理 - Mercari Engineering Blog](https://tech.mercari.com/entry/2019/06/07/155849)
- [メルペイにおけるお客さま残高の管理手法 - Mercari Engineering Blog](https://tech.mercari.com/entry/2019/06/13/171305)

## @akkie	Readable code in Go
- コードを読みやすくするためのTips
  - lintでは救いきれないもの
  - チームで話題となったもの
- 読みやすいコードとは
  - 他の人が短時間で理解できるもの
 - 明確な言葉を選択する
  - FilterよりもSelect,Exclude,Older Than
  - SetXXXはgetter setterを思わせるので、重い処理にはつけない
- コメントにはWhyを書く
- 追加要件の時は実装を一から見直す
- **読み手への思いやりが時間節約、技術負債解消につながる**

### 感想
- whatではなくwhyを書くは実践しているが、**読み手への思いやりが時間節約、技術負債解消につながる** これは常に肝に銘じたい、、(こなれてくるとより一層自分の癖が満載のコードになりそう)

## @tenntenn	The Go Playgroundをコマンドラインから扱う
- go playGroundで、**標準パッケージ以外も使えるようになった**
  - 作ったOSSのreadmeとかに貼るといいかも
- **複数ファイルをかけるようになった**
- **ディレクトリもほれるようになった**
- 複数のファイルをタブで管理できるGhrome拡張機能がある
- [GitHub - tenntenn/goplayground: client of Go Playground](https://github.com/tenntenn/goplayground)でcliでいじれる
- shareリンクを作ったり、ファイルをdownloadできたりする
- txtarをGoのコードから扱う
  - Goのinternalにある
  - 外にだしてあるライブラリを使う
  - txtar -c txtar -xコマンドでできるじゃん、。。。
- gpが活用できる場面
   - DevQuiz
     - 複数ファイルをまとめて提出できる
     - 採点者が簡単に採点できる
     
### 感想
- 思った以上にGo Playgroundが進化していてびっくりした
- **自分でライブラリを作った場合は、Readmeにぜひこの方式で貼らせてもらおう**

## @tottie	Gopher イラスト発表
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ドラム叩いているgopher君は拝めなかったけど最高だった、、<br> <a href="https://twitter.com/hashtag/mercarigo?src=hash&amp;ref_src=twsrc%5Etfw">#mercarigo</a> <a href="https://t.co/EfG0buqTdQ">pic.twitter.com/EfG0buqTdQ</a></p>&mdash; nari@技術書典7📖 GoとAWSで作る本格slackbot (@fukubaka0825) <a href="https://twitter.com/fukubaka0825/status/1151467090097737728?ref_src=twsrc%5Etfw">July 17, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">来場してくださった皆さまも来れなかった皆さまも本日は本当にありがとうございました！沢山の楽しいイラストのリクエスト頂いてとても嬉しいです。本日のイベントでライブドローイングしたものを貼っていきます🙇‍♀️<br><br>▼集まったリクエスト<a href="https://t.co/sBOsSb0Tl0">https://t.co/sBOsSb0Tl0</a><br> <a href="https://twitter.com/hashtag/mercarigo?src=hash&amp;ref_src=twsrc%5Etfw">#mercarigo</a> <a href="https://t.co/Wzx5q6BPcD">pic.twitter.com/Wzx5q6BPcD</a></p>&mdash; tottie ｜ Designer (@tottie_designer) <a href="https://twitter.com/tottie_designer/status/1151489687334244352?ref_src=twsrc%5Etfw">July 17, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ライブドローイング② <a href="https://t.co/tmKsJn3Sfa">pic.twitter.com/tmKsJn3Sfa</a></p>&mdash; tottie ｜ Designer (@tottie_designer) <a href="https://twitter.com/tottie_designer/status/1151489997981175808?ref_src=twsrc%5Etfw">July 17, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ライブドローイング③<br>LINEスタンプ制作時に鍛えられたようで、本日は自分で思ってたよりも沢山描けました😳笑<br><br>ライブドローイングははじめての経験で、緊張して途中手がちょっと震えましたが無事に描ききれて安心しています。みなさま本当にありがとうございました！🙏☺️ <a href="https://t.co/vsgA99YY3Q">pic.twitter.com/vsgA99YY3Q</a></p>&mdash; tottie ｜ Designer (@tottie_designer) <a href="https://twitter.com/tottie_designer/status/1151490824615497730?ref_src=twsrc%5Etfw">July 17, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 感想

- LT中のリアルタイムで様子が別モニターで映し出されていて、どっちを見たらいいのか少し困りましたが、素晴らしいイベントでした
- ~~**次回はドラム叩いてたりとか、DJしているとか音楽モチーフのGopherくんが見たい！！** 是非是非よろしくお願いします。。~~
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">イベント内では描けませんでしたが、ドラムを叩いているGopherさん描きました☺️ <a href="https://t.co/i1fQYd8jDP">pic.twitter.com/i1fQYd8jDP</a></p>&mdash; tottie ｜ Designer (@tottie_designer) <a href="https://twitter.com/tottie_designer/status/1151519799215738880?ref_src=twsrc%5Etfw">July 17, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">イベント内には描けなかったけれど、Twitterで観測できた2枚分だけ追加でGopherさん描かせていただきました🌈🙇‍♀️ <br><br>今日はもう手が動かなくてこれ以上は無理そう...線が震えてますね...😭😨笑<br>ご来場本当にありがとうございました🙏🙏🙏感謝 <a href="https://t.co/y384x6E3Jw">pic.twitter.com/y384x6E3Jw</a></p>&mdash; tottie ｜ Designer (@tottie_designer) <a href="https://twitter.com/tottie_designer/status/1151520969220972545?ref_src=twsrc%5Etfw">July 17, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


**なんとこの記事を書いている最中に、わざわざドラムを叩いているGopherくんを書いていただきました！！**このままグッズ化してほしい。。
本当にありがとうございました！家宝にします！