この記事は、Mercari Advent Calendar 2021 の17日目の記事になります。
こんにちは。メルカリのバックエンドのチームでインターンをしている@torichanです。私は、2020年の8月から11月にBuild@Mercariのインターンとして、また、今年は10月から再びインターンとして働いています。
本日はチームで現在取り組んでいるモノリスからマイクロサービスへのデータマイグレーションについての話とインターンシップを通した学んだことについてお話ししたいと思います。
そもそもマイクロサービスマイグレーションって?
皆さん、マイクロサービスマイグレーションという言葉は聞いたことありますか? 私はメルカリのインターンシップに参加するまで、この言葉を知りませんでした。社内では、メルカリの古いモノリスからマイクロサービスへの移行するとという意味で使われています。似たような社内プロジェクトに、Robust Foundation for Speedがありますが、こちらはマイクロサービスマイグレーションの先にあるプロジェクトになります。
私たちのチームのミッション
私が所属するチームはマスターデータをメインに取り扱うチームになります。具体的には検索のカテゴリー、取り扱っているブランドの種類、運送の情報などのデータを持っています。
現在チームでは、マスターデータに関するデータとシステムをマイクロサービスに移行するために、マイクロサービス側でのエンドポイントの作成と、コード内の至る所でDBアクセスを行っているモノリスのコードをリファクタリングし、接続先をマイクロサービスに変更する作業を行なっています。最終的には、モノリス上のマスターデータをマイクロサービスに移管することを目標に日々頑張っています。
実際に私がインターンシップで行ったこと
去年の8月から11月までのインターンシップでは、チームはモノリスにあるHTTPエンドポイントをマイクロサービスに実装した段階でした。私はマイクロサービス内にあるHTTPのエンドポイントをgRPCでも呼び出せるように、新しくgRPCエンドポイントの設計と実装を行いました。実装した時点では、エンドポイントの受け口を作成しただけでしたが、現在は実装したエンドポイントにトラフィックが流れ、実際にサービスとして使われています。他にもマイクロサービス用にセキュリティ関連のテストを追加したり、チームで別途新しく持ち始めたマイクロサービスの立ち上げからリリースまで関わる仕事もしたりしました。
現在、私のチームでは、PHPで書かれているモノリスからGoで書かれているマイクロサービスへのデータマイグレーションを行っています。具体的には、メルカリのモノリスに存在しているマスターデータの接続先をモノリスDBからマイクロサービスへのRPCに移行し、同時にモノリスのコードのリファクタリングを行なっています。
本当は記事執筆時点で、マイグレーション関連のタスクを終え、仕事の大変だったところの話もしたかったのですが、現在もまだ実装途中です。進捗としては、マイクロサービスのエンドポイントの実装と、外部メトリクスツールの整備まで終了し、マイグレーションのためにPHPのモノリスのコードをリファクタリングしている最中です。
このタスクで学んだこと ・ 難しさを感じているところ
「メルカリのバックエンドではGoを使っている」というイメージを持っている方が多いかもしれませんが、メルカリの中核となっているモノリスのコードはサービス立ち上げ当初に使われていたPHPで書かれています。
データをマイグレーションするタスクをする上で、たくさんのPHPのコードを読む必要や書く必要がありました。私はGoは勉強したことがあったのですが、PHPについては、今まで一度も触ったことも、勉強したこともありませんでした。そこで、社員さんにおすすめの勉強方法を聞いたり、PHPの公式ドキュメントで基本的な文法を勉強したり、社員さんとペアプログラミングをしたりして、最低限コードが書ける状態になりました。
他に難しさを感じている点としては、ある部分のコードの実装を行なったところ、自分が触っていない大きな規模のテストが落ちるようになりました。自分でもエラーの原因を特定しようと、関数を追ったり、怪しい部分を特定しようとしましたが、どうしても難しく、チームメンバーに助けを求めたり、専門のチームの方にお願いして原因の特定をしていただいたりしました。新しい言語を扱いつつ大規模なコードベースにコミットするというのはとても困難ですが、チームメンバーや他のチームの人たちの協力もあり進めることができています。
また、メルカリのモノリスを今回のインターンシップで初めてしっかりと触りました。巨大なサービスを触った経験が少なく、どの関数がどう使われているのか、テストや本番環境ではどのように起動するのか、学ぶことがすごく多いです。
インターンシップを通して学んだこと
今回のインターンシップを通して、大きく2つのことを学びました。1つはコミュニケーションの重要性、もう1つは、自分が取り組んでいる仕事の目的を明確にすることです。
コミュニケーションの重要性
私は昔、「インターンシップでは、いかに企業で使われている技術スタックについて自分が詳しいか」ということが重要だと思っていました。しかし、実際にインターンとして働いてみると、技術力以上にチームメンバーや他のチームの人とコミュニケーションが取れるかどうか、ということが非常に重要だと感じました。
今回のタスクでは、自分にとって新しい技術である、PHPとモノリスについて学びました。その中、「このタスクで学んだこと ・ 難しさを感じているところ」の章でも多く触れていますが、チームメンバーにペアプログラミングの依頼をすることや本当に分からない時に頼れるチームなど、適切な時に適切な人に頼ることができる能力が必要だと感じました。
最近では頼りにいく先として、そもそもメルカリにはどのようなチームがあるか理解するために、様々なチームの方とお話しさせていただく取り組みを個人的に行っています。この取り組みの特徴として、1on1していただいた社員さんに次の1on1する方を紹介していただくことで、様々なチームの人を紹介していただいています。今までに、通訳の仕事を行っている人や、HRBPの人と話す機会をいただき、今までに自分が関わってこなかったチームの人や、実は自分たちのチームを支えていたような人の存在がたくさん見えてきました。
これらの取り組みを通して、メルカリの社員さん達は非常にコミュニケーションが取りやすく、困ってることや悩んでることがあれば、全力で協力してくれる方が多いと感じました。今回のこの記事の作成にあたっても、自分のチームのみならず、沢山の方々にレビューをいただき、自分も困っている人がいたら手を差し伸べることができるような存在になりたいと思いました。
取り組んでいる仕事の目的を明確にする
インターンを初めて4週間が過ぎた頃に、マイグレーション関連のタスクに取り組んでいたのですが、いただいたチケットがレビュー待ちで、しばらくレビューが進まないということがありました。その際に、次にやるべきタスクがわからず、メンターに聞くにも忙しそうで聞きづらいということがありました。当時のメンターとの1on1で、「このようなことがあり、仕事が進んでいない」という話をしました。その時は、やることがない時はメンターに気軽に聞くこと、メンター側は気軽に聞けるように努力することをお互いに反省しました。
このことを通して、自分の中にもらった仕事をただこなしていくという意識があることに気づきました。仕事のすべきこと一点にフォーカスするのではなく、この仕事が終わったら、次はこれを実現するために、この仕事をする必要がある…という風に「より全体を意識して仕事をする」必要があったことに気づきました。最近では、このタスクは何故やる必要があるのか、最終的には何を目標にタスクを進めていくのか、というのを小さな仕事に対しても意識するようにしています。また、タスクを進めていく上で、わからないことがあった時は、ドキュメントを調べたり、チームメンバーや周りの人に積極的に質問できるようになりました。
最後に
このブログでは、メルカリでのマイクロサービスマイグレーションについて話とインターンシップを通して学んだことについての話をさせていただきました。メルカリのインターンシップでどのような仕事ができるのか興味のある方に、今回のブログが少しでも参考になれば幸いです。
メルカリでは、インターンを通年で積極採用しています。興味を持った方はぜひ応募してみてください。
https://careers.mercari.com/jp/students/
明日の記事は sotaさんです。引き続きお楽しみください。