Bonfire Backend #3 に参加②(メルペイ、PayPay)
今日も引き続き、Bonfire Backendの続きを記録します。
再び唐揚げドーン!
第2弾は、メルペイとPayPayです。
メルペイ
よくCMでも見かけるので、言わずも知れていますが、MPM式の決済サービスです。
www.merpay.com
サーバサイド
メルペイではGCP上で、Go言語でマイクロサービスを構築しています。
メルカリって言ったらGo言語っていう勝手なイメージがあります。
よくGo言語のイベントがありますからね。(一度も抽選通ったことありませんが。。)
EMV規格にそうように、go-my-codeライブラリを使用しています。
github.com
マイクロサービスアーキテクチャ
決済のアーキテクチャーに関して、メルカリさんのブログで公開されていますので、こちらは非常にわかりやすくて参考になります。
tech.mercari.com
リクエストに対してAPI Gatewayが受け付けます。
その後StaticMPM ServiceでQRコード解析、セッショントークン管理、決済処理を行います。
決済処理に関してはさらに、別のマイクロサービスに委託することで、さらなる独立性を実現しています。
不整合対策
マイクロサービスにしていることで、機能は分散されますが、その分マイクロサービス間の整合性は確保しなければなりません。
その対策として以下を挙げておりました。
冪等性
二重決済などされないようにするため、クライアントからのリクエストの内容にidempotency keyを持たせるようにしています。
その結果同じリクエストに対して、同じ結果が返せるようになっています。
Write repair
マイクロサービス間で障害があった場合、リトライして不整合を修復するようにしている。
その際のライブラリとして、retryを使用しています。
http:// https://godoc.org/github.com/grpc-ecosystem/go-grpc-middleware/retry
Asynchronous repair
Write repairで修復できなかった場合、非同期にチェックして、修復するようにする。
課題
課題として挙がったのは、
- 上記内容を各マイクロサービスに実装するのが大変
- 擬似的に障害を起こして、テストするのが難しい
といった点がありました。
これから
Envoyを使用して、流行りのサービスメッシュを導入してみたい
PayPay
こちらも多々CMで見かけますね。
なんと900万顧客、70万店舗で利用されているらしいです。すごい規模!
さらに常に40~50のキャンペーンが動いているみたいです。
paypay.ne.jp
開発スタイル
アジャイル型で週1スプリントで進める。
10ヶ月間で50回以上のリリースをしているそうです。
外国籍のエンジニアが40%以上います。
サーバサイド
AWS上で動作し、マイクロサービスをJavaのSpring Frameworkで構築されています。
60以上のマイクロサービスがあるそうです。
マイクロサービスにした理由として、
- 開発とリリースも早くなる
- 決済に影響させずに、関係ない部分の製造ができる
- ビジネスコンテキストが増えたら、マイクロサービスを増やせばいい
などがありました。
またWriteとReadでDBが分離されています。
マイクロサービスアーキテクチャー
Kafkaを使用して、イベント駆動の非同期サービスを実現しています。
つまりKafkaにPublishされたイベントを、興味があるサービスだけが取り出して、処理を行うようになっています。
またAkka StreamsをScalaで構築することで、分散・並列のストリーミング処理を実現しています。
利点
このアーキテクチャーでの利点として、
- 一部イベントだけ別環境に流し、テストしてそのまま移行も可能
- サービス依存が少ない
- Amazon RDS からAmazon Auroraへのマイグレーションをメンテナンスなく進められる
課題
こちらでもマイクロサービスの整合性の担保の難しさが挙がっていました。
またAkka内部が見えないので、可視化する必要があると言った点もありました。
参加した感想
今までバックエンドエンジニアとして、マイクロサービスの製造は関わってきましたが、インフラ周りは専門ではありませんでした。
なので今回、たくさん初めて知った技術を聞くことができたした。
今後はもっと初めて知った技術を掘り下げていき、掲載できれば載せていきたいと思います。
それとこう言った、最新技術を触れる環境が非常に羨ましく思えました。
エンジニアにとっては、非常に充実した会でした。
また参加したいと思います。