見出し画像

10年目 GOサービスの運用について(ビルド、スケーリング、監視)

2024年6月8日(土)に開催された、Go Conference 2024 Springにて、ミイダスは"Go"ld スポンサーを務めさせて頂き「10年目 GOサービスの運用について(ビルド、スケーリング、監視)」というタイトルで、弊社の磯崎が発表をしました。
転職サービス「ミイダス」ではリリース当初からGoを採用し、現在運用10年目です。この10年目のGoサービスをどのように運用しているか詳細を共有しました。

スポンサーブースのレポートもぜひご覧ください。

ミイダス株式会社の磯崎と申します。よろしくお願いします。
発表の前に余談なんですけど、先週ぐらいに人工知能学会を興味本位で見たのですが、いくつかのセッションは、ほとんど何を言っているのかわからない感じでしたが、その中で何もわからないなかでも面白いセッションがありました。シンギュラリティ後の社会、つまりAIが人間の知能を超えた後に人間はどうなるのかというテーマでした。
人工知能を専門としている大学の教授が、大真面目に、現在の人間がゴリラを大切にしているように、AIも人間を大切に扱ってくれる可能性があるのではないかということをゴリラ問題として言いながら、真剣に議論していました。
その学会では、機械学習などを真剣に研究している人たちの発表が多い中で、こうした少しとっつきやすい話題もあり、自分の中では少し和む感じがしました。この発表も、そういうものになったらよいなと思っています。よろしくお願いします。

次に自己紹介ですが、ミイダスという会社でCTOを務めていますが、一応まだ現役のGOエンジニアのつもりです。
スポンサーセッションなので、会社の紹介もさせていただきます。
ミイダスは、入社後の活躍を目的としたアセスメントリクルーティングで適材適所の人材の採用を実現しています。要は転職のアプリで、現在ユーザーは150万人、企業アカウントは40万社に上ります。

性格診断や認知バイアスを利用して、転職後の活躍をサポートできるように作ったサービスになります。転職して終わりではなく、その後もサポートしていきたいと考えています。診断内容については、ヴァイタリティやマネジメント気質など、50種類以上の指標が計算されます。これをもとに、2年前にGoカンファレンスで、GOエンジニアの特徴について話したこともあります。覚えている方は少ないと思いますがGoエンジニアの特徴として、問題解決力が高いことと、人当たりが低いことがデータとして出ていたことです。これはデータだけ見ると「ああ、そういうものなんだな」と思うかもしれませんが、ちょっと面白かったのは、人当たりの値がミイダスのマスター上2000近いデータの中で最低だったことです。本当にGoのエンジニアは尖っているんだなと思い、発表させてもらいました。

当時の発表の記事はこちら

現在、それらの数値は医療分析装置の技術者や金型作成の技術者に負けています。Goのエンジニアの数が増えてきて、コミュニティも少しずつ変わってきているのかもしれません。今回はちょっと角度をかえまして、指標をGo、React、Pythonで比較した表をだします。

どれも、人当たりやチームワークは低めですが、創造的思考や問題解決力は高いという傾向があります。ちなみに、このデータはあまり厳密なものではないので、あくまでネタとして聞いてください。
ただ、Webエンジニアと言われている人がこういう性格属性を持っているんだなというイメージが持てると思います。ミイダスの診断はなかなか信憑性があるのではないかと思ってもらえるのではないかと思います。
余談続きで申し訳ないんですけど、最近、電極剥き出しのバッテリーを買ってきて、太陽光パネルとつないだりしています。ラジコン飛行機用のモーターをバッテリーに直接つないで思いっきり回しているところです。

普通の扇風機の10倍以上のパワーが出るのですが、この配線を間違えると火花が飛んだり、配線が熱を持って溶けてしまったりめちゃくちゃ危ないので、きちんとどう作るのか、などを慎重に考える必要があります。

プログラミングも、自分が働き始めたころはコンパイルに30分かかるので、かなり慎重に作業をしていました。
現在のプログラミングは間違いをすぐにIDEが指摘するし、コンパイラが親切なので、プログラマーに求められる性格も変わってきているのではないかと思います。
さきほどの結果を、COBOLと比較してみたのですが、全然違った形になっていますよね。COBOLがどうこうというわけではないのですが、同じエンジニアでも時代や仕事内容によって向いている性格も変わっていき、今後もAIの活用とかで、またエンジニアの属性も変わってきているのだろうなと思いました。

ちなみに、Webエンジニアと正反対の職業として、成績の良い営業職というデータも出します。エンジニアが得意なところが低く、逆に不得意なところが高いというデータが出ていて、これも面白いなと思いました。このデータはたまたま出しただけなので、あくまでネタ程度にしてください(笑)
ただ、こういうデータが、未経験者や新卒者が自分に向いている可能性が高い職業をあらかじめ知っておくことで、本人にとっても、採用する企業にとってもメリットがあります。
ミイダスでは、こういうデータを基に適材適所な働き方を目指しています。エンジニアには、登録時にたくさんの質問がありますので、諦める方も多いですが、興味があればぜひ登録して、診断を試してみてください。

ビルドプロセス

では本題に入りたいと思います。 ミイダスは今10年目のサービスです。バックエンドエンジニアには20名以上在籍しており、毎日30コミット以上行われ、トータル57万行とかなり大規模なサービスになっています。ここでは、ビルドプロセスやスケーリングの変遷についてお話ししたいと思います。
まず、ビルドプロセスに関してですが、GitHub ActionsとJenkinsを使用しています。Lintやimportチェック、自動テスト、ライブラリの脆弱性チェック(govulncheck)、暗号鍵などのソースコードの混入チェックを行っています。赤字については後で触れますが、「何だこれ?」というものが入っているのは、そういうことがあったんだ、と察してください。
また、GitHub Actionsで工程のフォローも行っています。マイルストーンからプルリクエストのリマインドを飛ばしたり、開発ブランチを自動で作成したり、マスターから戻すなどの作業も行っています。デプロイに関してはPGOを導入しています。

まずLintについてですが、これはみんなやっていると思いますが、ローカルで設定するように言っても、結局誰かが設定しないということがよくあります。そのため、マージ時にコメントがつくBotを導入しました。これで「TODOコメントを入れてはいけない」という指示をしてくれるので、各人の設定に関係なく統一でき、なかなか良かったと思います。

また、インポートのチェックについても自作のツールを使用しています。ミイダスのバックエンドは1つのGitプロジェクトで行っており、アプリケーションがたくさんあるため、参照ルールを間違えるといろいろ面倒です。ASTを使ってインポート文をすべて取り出し、このパッケージはこのパッケージを使用してはいけないというルールを定義して、そのチェックをしています。プロジェクトを分けろと言われたらそれまでですが。

次に、脆弱性のチェックについてですが、最近ツールに追加されたと思います。ミイダスでは、go.modが138行もあり、定期的に最新化するプルリクエストを自動で飛ばすような運用をしています。
pgoに関しては、ビルド時に本番から取得したプロファイルを入れるだけで簡単にCPUの利用率が下がる感じです。この辺の解説はさまざまあると思いますが、導入も簡単ですし、CPUネックがあれば試さない理由はないと思います。
ビルドのプロセスに関しては以上です。

スケーリングの変遷について

次にスケーリングについてですが、今と昔では考え方がいろいろと変わってきました。すごく初歩的な話で申し訳ないのですが、昔は何でもかんでも遅い場合、go routineで並列処理すればいいんじゃないかと考えていましたが、これで酷い目にあったことがあります。

次に、バッチコンテナをECSで制御するようになり、うまくコントロールできるようになりましたが、徐々にgRPCサーバーのようなマイクロサービス構成に移行するとうまくいかなくなってきます。
バッチ処理が遅いならバッチのコンテンツを増やし、バッチの数を増やせばマイクロサービスはオートスケーリングされるので、完璧、と思っていました。
しかし、処理のほとんどがgRPCのバッチがあると、gRPCの処理待ちするだけのコンテナが何十個も立ち上がる事態になってしまいました。
go routine は、自身のリソースを使い切るためや目標の時間に間に合わせるために使うべきです。お気をつけください。

監視について(NewRelic)

次に監視についてですが、New Relicの話です。使っている方もいるかもしれませんが、New Relicを契約したときに「ソースコードが汚くなりそうだ」とか、「APMの分析が必要なほど複雑なことはそもそも間違っているのではないか」といったネガティブな意見もありました。しかし、実際には非常に便利です。APMを使っている方なら共感していただけると思いますが、Goでもこの粒度でちゃんと監視できますし見えます。

HTTPのリクエストやデータベースの処理時間が可視化されており、自分で設定した区間のタイムも測れるようになっています。結果としてミイダスでは1000箇所以上のカスタム処理が埋まっており、ソースはやや汚くなっている部分もありますが、こうした可視化によって改善が進むというメリットがあります。
他にも、環境を横断してデータを見たり、監視条件を設定できるようになっています。SQLのような形でクエリを書いて警告アラートを飛ばすかどうかなどを管理できます。監視のオンオフも可能です。

New Relicは非常に高機能で、できることやログの量に圧倒されます。ログのIDが10兆とかになっていて「こんなにあるの?」と思いましたが、非常に大量のデータを処理してくれています。ただ、料金は高いので、一定規模以上のプロジェクトじゃないと適用できないかもしれませんが、おすすめです。
以上です。運用事例として参考にしていただけると幸いです。

最後に、ミイダスは2015年に開発開始した時からGoを使用していて、当時はバージョン1.4でした。運用のノウハウもなく、go.modがなくてライブラリ管理がめちゃくちゃだったりでした。が、10年近く前から現在まで、参画していただいた皆さんと、初心者同士で試行錯誤しつつ取り組み、今この場にスポンサーとして立つことができて、非常に嬉しく思っています。

昔は未経験者の方ばかりでしたが、最近では経験者の方も少しずつ参画いただくようになり、コミュニティ自体が大きく成長していると感じています。これからももっと盛り上げていきましょう。

また、現在ミイダスではGOエンジニアを募集中です。まだまだ未熟なサービスですので、助けに来ていただけると幸いです。ご清聴ありがとうございました。


この記事が気に入ったらサポートをしてみませんか?