PC依存エンジニアのブログ

開発者向けにIT関連の情報をお届けしています。特にバックエンド開発者向けの内容が多めです。たまにフリーランス情報もお届けしています。

Bonfire Backend #3 に参加②(メルペイ、PayPay)

今日も引き続き、Bonfire Backendの続きを記録します。

再び唐揚げドーン!

Bonfire

第2弾は、メルペイとPayPayです。

iristech.hatenablog.com


メルペイ

よく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上で動作し、マイクロサービスをJavaSpring Frameworkで構築されています。
60以上のマイクロサービスがあるそうです。

マイクロサービスにした理由として、

  • 開発とリリースも早くなる 
  • 決済に影響させずに、関係ない部分の製造ができる
  • ビジネスコンテキストが増えたら、マイクロサービスを増やせばいい

などがありました。

またWriteとReadでDBが分離されています。

マイクロサービスアーキテクチャ

Kafkaを使用して、イベント駆動の非同期サービスを実現しています。
つまりKafkaにPublishされたイベントを、興味があるサービスだけが取り出して、処理を行うようになっています。

またAkka StreamsをScalaで構築することで、分散・並列のストリーミング処理を実現しています。

利点

このアーキテクチャーでの利点として、

  • 一部イベントだけ別環境に流し、テストしてそのまま移行も可能 
  • サービス依存が少ない 
  • Amazon RDS からAmazon Auroraへのマイグレーションをメンテナンスなく進められる

課題

こちらでもマイクロサービスの整合性の担保の難しさが挙がっていました。
またAkka内部が見えないので、可視化する必要があると言った点もありました。

整合性の強化

整合性の強化として以下の方法を示していただきました。

冪等性

同じリクエストが何度きても同じ結果を返せるように、メルペイ同様idempotencyを持たせています。

マイクロサービス間の突合

リアルタイムでも、定期的にも情報があっているかどうかをチェックしています。
もしチェックが失敗した場合、補償トランザクションが動作するようになっています。

補償トランザクション

自動で不整合が発生した場合に、復旧措置を行う。

参加した感想

今までバックエンドエンジニアとして、マイクロサービスの製造は関わってきましたが、インフラ周りは専門ではありませんでした。
なので今回、たくさん初めて知った技術を聞くことができたした。

今後はもっと初めて知った技術を掘り下げていき、掲載できれば載せていきたいと思います。

それとこう言った、最新技術を触れる環境が非常に羨ましく思えました。
エンジニアにとっては、非常に充実した会でした。

また参加したいと思います。