はじめに
こんにちは。Wano株式会社エンジニアのnariです。
今回は何と言っても@tottieさんによる**Gopher ライブドローイング!!!!** それ以外の内容も素晴らしかったため、復習がてらまとめ記事を書かせていただきます。今日はこれにきてます!
— nari@技術書典7📖 GoとAWSで作る本格slackbot (@fukubaka0825) July 17, 2019
mercari.go #9 https://t.co/kaD9Czw6DA #mercarigo
タイムテーブル
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 - 私はドラム叩くgopherくんを依頼してみました

@rerorero protoactor-goでPregelを作った話
- GitHub - rerorero/prerogel: Go implementation of Google's Pregelの概要説明
- どう作るか
- 分散システム ワーカー、パーティション、ノードそれぞれステートマシーンが必要
- アクターモデル
- 並行計算モデル
- GOにはchannelがあるのに必要?
- 一箇所で管理したい 整合性が重要
- チャットサーバーやゲームサーバーなどがユースケース
- GitHub - AsynkronIT/protoactor-go: Proto Actor - Ultra fast distributed actors for Go, C# and Java/Kotlinを使って実装
-
let it crach
- Erlangからきている とにかくクラッシュ
- 親がこのクラッシュを検知してリカバリーを試みる
-
スーパーバイザーストラテジー
- .Netでもprotoactore-go は使える
- Goでアクターモデル使いたいなら、protoactor-go一択
感想
- アクターモデルの存在を恥ずかしながら初めて知った、、
- マイクロサービスにも使われている「アクターモデル」による並列処理プログラミング入門 – SIOS Tech. Labをとりあえず読んで概念を抑えた
- 排他制御に悩まされずスケールできて良さそう
- 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.でコード生成している
- database/sqlパッケージ使ってない
-
APIの設計
- balance serviceでは各種の残高の増減を提供する
- 他のサービス
- payment service
- 様々な決済手段を提供する
- 決済をフェーズに分割
- 決済受付
- 決済成功失敗
- 返金
- 各フェーズでリトライやロールバックをして成功失敗
- balanceを叩くフェーズも起こりうる
- 全ての残高の種類を共通のインターフェースで扱いたい
- どの残高の操作するときも同じように扱える
- 複数斬だけを処理する場合の失敗処理が楽
- まとめてUseCase層でロールバックできる
- payment service
- マイクロサービスの機能を提供するときにはどんなサービスから叩かれるのかを意識するべき
-
冪等性を担保するための仕組み
- payment sercieは決済のフェーズごとにリクエストを送ってくる
- 失敗したら再度リトライする
- 基本的にリトライされる
- もし冪等性がなかったら
- とにかくリクエストを受けると全て処理する
- その取引で二十三十引いてしまうかもしれない
- 参照系のRPCの冪等性
- あまり必要としない
- 更新がかかるようなRPCの冪等性
- 残高を消費したい
- 途中でタイムアウトしたら
- 叩く側のマイクロサービスがリトライしたら
- 冪等性を担保する必要がある
- 取引IDをチェックして処理を行う
- パラメータが同一の処理がすでに行われているか調べる
- すでに取引がある場合には処理せずその結果だけ返す
- payment sercieは決済のフェーズごとにリクエストを送ってくる
- 冪等性はサービスの信頼性を保証するためには必須
-
balancesercie では種に取引IDで冪等性を担保している
- お客様の残高の追跡する方法 - 1.取引レコードから算出する ES的な発想
- 2.取引後の残高のスナップショット
- 操作まいにそれぞれに履歴テーブルにレコードを保存してる
- 取引後の残高スナップショットはgit的な仕組みでID参照のチェーンで参照がつながっている
-
balancesercie では種に取引IDで冪等性を担保している
- まとめ
- アプリケーション設計 冪等性 お客様のデータの保存 の話をしました
- シンプルな機能を提供しているマイクロサービスでも考えるポイントはたくさんある
感想
- クリーンアーキテクチャやトランザクション管理の話は、個人的な興味領域なので非常に参考になった
- 懇親会でもかなり質問させていただきましたが、トランザクションオブジェクトがusecase層に漏れるのは仕方がなさそうでした。。(repositoryで完結はまず無理だし、非同期での担保ってわけでもないみたい)
- それぞれのマイクロサービスで設計思想がかなり異なるようなので、それぞれ聞いてみたくなった
- ESとスナップショットのユースケースでの使い分けを質問し忘れた、、 これは今度聞いてみよう
- 後dto -> domainモデルの変換はdtoにメソッド生やすのが確かにいいかもと懇親会で気づきを得た。。
- Spannerの良さは、RDBとsql構文の恩恵を受けながらスケールインアウトがイージーなとこなんだろうな そこも詳しく聞いてみたい
参考記事
@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でcliでいじれる
- shareリンクを作ったり、ファイルをdownloadできたりする
- txtarをGoのコードから扱う
- Goのinternalにある
- 外にだしてあるライブラリを使う
- txtar -c txtar -xコマンドでできるじゃん、。。。
- gpが活用できる場面
- DevQuiz
- 複数ファイルをまとめて提出できる
- 採点者が簡単に採点できる
- DevQuiz
感想
- 思った以上にGo Playgroundが進化していてびっくりした
- 自分でライブラリを作った場合は、Readmeにぜひこの方式で貼らせてもらおう
@tottie Gopher イラスト発表
ドラム叩いているgopher君は拝めなかったけど最高だった、、
— nari@技術書典7📖 GoとAWSで作る本格slackbot (@fukubaka0825) July 17, 2019
#mercarigo pic.twitter.com/EfG0buqTdQ
来場してくださった皆さまも来れなかった皆さまも本日は本当にありがとうございました!沢山の楽しいイラストのリクエスト頂いてとても嬉しいです。本日のイベントでライブドローイングしたものを貼っていきます🙇♀️
— tottie | Designer (@tottie_designer) July 17, 2019
▼集まったリクエストhttps://t.co/sBOsSb0Tl0
#mercarigo pic.twitter.com/Wzx5q6BPcD
ライブドローイング② pic.twitter.com/tmKsJn3Sfa
— tottie | Designer (@tottie_designer) July 17, 2019
ライブドローイング③
— tottie | Designer (@tottie_designer) July 17, 2019
LINEスタンプ制作時に鍛えられたようで、本日は自分で思ってたよりも沢山描けました😳笑
ライブドローイングははじめての経験で、緊張して途中手がちょっと震えましたが無事に描ききれて安心しています。みなさま本当にありがとうございました!🙏☺️ pic.twitter.com/vsgA99YY3Q
感想
- LT中のリアルタイムで様子が別モニターで映し出されていて、どっちを見たらいいのか少し困りましたが、素晴らしいイベントでした
次回はドラム叩いてたりとか、DJしているとか音楽モチーフのGopherくんが見たい!! 是非是非よろしくお願いします。。
イベント内では描けませんでしたが、ドラムを叩いているGopherさん描きました☺️ pic.twitter.com/i1fQYd8jDP
— tottie | Designer (@tottie_designer) July 17, 2019
イベント内には描けなかったけれど、Twitterで観測できた2枚分だけ追加でGopherさん描かせていただきました🌈🙇♀️
— tottie | Designer (@tottie_designer) July 17, 2019
今日はもう手が動かなくてこれ以上は無理そう...線が震えてますね...😭😨笑
ご来場本当にありがとうございました🙏🙏🙏感謝 pic.twitter.com/y384x6E3Jw
**なんとこの記事を書いている最中に、わざわざドラムを叩いているGopherくんを書いていただきました!!**このままグッズ化してほしい。。
本当にありがとうございました!家宝にします!