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
Mercari Summer Internship 2021 Final Presentation
Search
Yoshiki Nagasaki
December 01, 2021
Programming
3.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Mercari Summer Internship 2021 Final Presentation
Yoshiki Nagasaki
December 01, 2021
Other Decks in Programming
See All in Programming
権限チェックの一貫性を型で守る TypeScript による多層防御
mnch
4
1.1k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
120
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
ふつうのFeature Flag実践入門
irof
7
3.6k
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
170
CLIであることを活かしたGitHub Copilot CLI活用術 / GitHub Copilot CLI Pro Tips & Tricks
nao_mk2
1
1.2k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
650
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.5k
RTSPクライアントを自作してみた話
simotin13
0
510
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
250
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
110
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
760
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Marketing to machines
jonoalderson
1
5.4k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
How to train your dragon (web standard)
notwaldorf
97
6.7k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.3k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
320
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
220
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
Practical Orchestrator
shlominoach
191
11k
Abbi's Birthday
coloredviolet
2
7.9k
Transcript
Yoshiki Nagasaki (champon) Summer Internship 2021 Results Presentation
@champon (ちゃんぽん) / Backend Engineer Internship PICTURE Picture which can
be identified your face is preferable 顔がわかる写真が好ましいです • Full Name : 長崎好輝 (Yoshiki Nagasaki) • GitHub : champon1020 • Twitter : champon1020 • Joining Time : 2021/08/01 • Career : M1 student (summer internship at Merpay) • Hobby : Anime, Comic, Programming • Strong : Go, Computer Vision • Weak : Careless mistakes • Message : Nice to meet you!
やったこと
やったこと 1. batchのsubcommand化 2. Outbox Patternの実装とテスト 3. Launchableからsubsetを取得するworkflow作成
batchのsubcommand化
batchのsubcommand化とは batch: 定期実行されるプログラム subcommand: あるコマンド下でさらに処理を分岐するコマンド (ex. git push,
git pull)
batchのsubcommand化 背景 • defpayのビルド時間を短縮したい • batchに共通化できそうな部分がたくさんあった 処理を共通化してソースコードを減らそう!
batchのsubcommand化 主に共通化できるコード • serviceやclientの初期化 ◦ cmd/batch/main.goにて共通化 • 環境変数 ◦
configに新たな環境変数として登録
batchのsubcommand化 進捗 計8個のbatchをsubcommand化した scheduled-repayment-v2 scheduled-repayment-result-checker payable-easypay debt-sync
reconcile-easypay-reviews overdue-easypay create-easypay-user-contract-record-v2 force-michael-sync (Released) (In Review) (Released) (Released) (Verified) (Verified) (Verified) (Approved)
batchのsubcommand化 学び • メルペイ(defpay)でのリリースフローを体験できた ◦ cronjobの更新 ◦ spinnakerを使ったリリース
• Goの使用に関して新たに学ぶことができた ◦ path.Joinとfilepath.Join ▪ WindowsではURLは”\”が必要なのでfilepath.Joinで はなくpath.Join ◦ io.NopCloser ▪ io.Readerを引数に取ることでio.ReaderCloserを返し てくれる Engineer Go
Outbox Patternの実装とテスト
Outbox Patternとは Outbox Pattern: マイクロサービス間の通信においてイベントが送信成功するまでリトライを継続して一 貫性を担保 サービスA サービスB 送信失敗 例
一貫性がサービスA内で完結してしまう
Outbox Patternとは Outbox Pattern: マイクロサービス間の通信においてイベントが送信成功するまでリトライを継続して一 貫性を担保 サービスA サービスB 成功するまでリトライ
例 一貫性をマイクロサービス間で担保
Outbox Patternとは publishworkerの概要図 Task Pub/Sub Spanner publishworker Retry until succeed
(check if error is retriable) Poll INSERT Send Task
Outbox Patternの実装とテスト TestNewWorker:workerの初期化 • Optionがちゃんと渡されているか確認 TestWorker_Start:workerをスタートする(taskをpollする状態に遷移する) •
既にworkerがRunningしている場合は何もしない • taskがあればpublishを開始 TestWorker_publish :taskをPubSubにpublishする • retriableか否かを判定できているか確認 進捗 計3つの単体テストを実装した (Merged) (In Review) (Merged)
Outbox Patternの実装とテスト 難しかったところ・工夫点 • gRPCのInterceptorを咬ますとDB Setupの時に”READY”状態で止まる ◦ Spanner Clientを2つ用意してDB名を共有
• CIがたまにDatabase not foundエラーを吐く ◦ 全テストでインスタンスは共通 ◦ TestMainでインスタンス内の全DBを消去している ◦ ➡ 必要無くなったデータベースをインメモリで保持
Outbox Patternの実装とテスト 学び • コードを読む力が付いた ◦ ライブラリやdefpayのコードを見ながら試行錯誤した
• spanner emulatorを触った ◦ 存在自体も初めて知った • for文の中でdeferしない ◦ forから抜けるまでdeferが積まれていく Spanner Engineer Go
Launchableからsubsetを取得するworkflow作 成
Launchableとは 背景 • Mercari / Merpayではシナリオテストにより実際にテスト環境にデプロイし た状態でAPIテストを行っている • 全テストを実行すると時間がかかるのでPRのdiffに影響のあるテストのみ
を実行したい Launchableを使う! ✓ 機械学習によりdiffに対応するテストファイルを学習 ✓ CLIベースで接続できるのでGitHub Actionsと連携可能 🚀
Launchable使用の流れ Defapy Repo Scenario Test Repo 🚀 Launchable Run Test
XML Diff All Tests Test Subset Test Report ① ② ③
Launchableのworkflow作成 現状 • とりあえずLaunchableにデータを送りまくってる状態 • シナリオテストは定期実行されている 今回やりたいこと subsetを取得してPRにコメントとして残す
• ちゃんと学習できているか確認 • QAにおいてどのようなテストを実行すれば良いかの参考になる
PRへのコメント 2回目以降のRunではコメントを 更新する PRへコメント
PRへのコメント Subset List merpay-scenario-testsの リポジトリへ飛べる
PRへのコメント Invalid Subset 試運用段階なのでfailさせ ずにリストに残してる
workflowの流れ defpayとscenario-testのコードを Launchableに登録 Launchableからsubsetを取得 subsetをmarkdownのテーブルに変換 PRにコメント
Launchableのworkflow作成 学び • 業務でのGitHub Actionsのworkflow作成を体験できた • 何のために使用するのかを意識して作成する
◦ QAの人が見て分かりやすいPRコメントを残す ▪ 何のシナリオテストなのか? ➡ Titleを表示 ▪ 実際のテストはどのような流れなのか? ➡ リンクを表示 Engineer CI
Thank you for your attention!