![見出し画像](https://assets.st-note.com/production/uploads/images/125858686/rectangle_large_type_2_c723006d47b3966767cd4a278085966b.png?width=1200)
【イベントレポート】ROSCAFE GO勉強会を開催しました!
皆さん、こんにちは!
ぶっちゃけ系エージェント、ROSCA広報のSahoです。
昨日12月26日(火)に弊社ROSCAが運営する「ROSCAFE」にて「ROSCAFE GO勉強会」を開催しました!
この記事では企画・運営、そして当日のモデレーターを勤めました私、Saho@ROSCA広報目線でイベントの様子をお伝えしたいと思います!
今回の登壇者のご紹介
今回もさまざまな事業の登壇者、3名が集合しました!
![](https://assets.st-note.com/img/1703747030515-qIwfFsK8S0.jpg?width=1200)
![](https://assets.st-note.com/img/1703747160222-UfiE2dE83H.jpg?width=1200)
![](https://assets.st-note.com/img/1703747349708-pY13DcLjab.jpg?width=1200)
LT1: 「PGOを導入したい!」Kanata Miyahanaさん 株式会社SODA テックリード
最初のLTは株式会社SODAさんより、Miyahanaさんです。株式会社SODAさんが運営されている「スニーカーダンク(スニダン)」は、毎月500万人以上が利用する国内No.1のスニーカー&トレカフリマアプリ。以前CTOの林さんにオフラインイベントに登壇いただいた際「スニダンのサービスはGoで書かれている」とお聞きしました!
PGOとは?
PGOとは「Profile-Guided-Optimization」の英語の頭文字をとったもの。Goのコンパイラはビルドするバイナリが、より良いパフォーマンスを出すための最適化を行っており、インライン展開やエスケープ解析などがある中、Goのチームはその最適化をリリースごとによりよくなるように改善を重ねてきました。しかし、これは大変な仕事だったそうです。「プロファイルを提供することでよりよい最適化を行うこと」をPGOと呼んでいます。
Go1.20で試験的に導入されたのち、Go1.21で一般公開版になりました。どれくらいの改善が期待されるのかということですが、PGOを有効にしたビルドで2-7%ほどのパフォーマンス向上が見込まれるそうです。
どのようにPGOを利用するのか
1.PGOを有効にしていないバイナリを本番環境にリリースする
2.本番環境でのプロファイルを集める
→いきなり本番で取得するのはいろいろ大変なのでまずはローカル環境で本番に近い形でプロファイルを取得してみる
3.集めたプロファイルを元に新しいバイナリをリリースする
4.2に戻る
ブログの例
Goが公式に公開している、Profile-guided-Optimization in Go1.21のブログでは、詳しい内容が書かれているとのことで今回はこの内容についての検証をご紹介いただきました。
![](https://assets.st-note.com/img/1703657896660-FoqHJ9Hxjd.png?width=1200)
結果としては逆に遅くなってしまったという数値になりました。
しかし、とても僅かな差のため誤差の範囲内とも言えます。
スニダンのサーバーでやってみる
そして次はスニダンのアプリのサーバーで検証を行いました。
1.PGOを有効にしないバイナリを本番環境にリリースする
・ローカル環境で本番環境に可能な限り近い状態でコンテナを動かす (擬似本番環境)
2本番環境でのプロファイルを集める
・よく呼ばれるAPI上位3つを選ぶ
・locust (Python) + boomer (Go) で負荷をかける
3.集めたプロファイルを元に新しいバイナリをリリースする
4.ベンチマークをとって比較してみる
・上記で呼ぶAPIのパフォーマンスを見てみる
![](https://assets.st-note.com/img/1703658233174-yZjH6ChT0a.png?width=1200)
一部のAPIでは、数値として改善されたというものは認められず、残念ながらPGOを導入してもレイテンシーの向上は見込めないという結果になってしまいました。
![](https://assets.st-note.com/img/1703658342704-cc6kt6l3B5.png?width=1200)
一方、 API 1(セッションあり)、API 3(セッションあり)の2つに関しては-10.79%、そして-7.95%という結果になりました。数字としても早くなっていることが分かります。
改善が見込まれるPGOですが、ソースの安定性と反復安定性が注意事項として公式のドキュメントで言及されています。
改善が見込まれるPGOですが、ソースの安定性と反復安定性が注意事項も公式のドキュメントで言及されています。
今回の検証で、頻繁に呼ばれるAPIのレイテンシーが導入により向上することが大きな成果として感じられたとのことでした!一方で、ソース安定性と反復安定性については検証を行えていないので、追加で調査する必要がありそうとのことでした。
LT2: 「Go言語でOSSを公開して学んだこと」Yota Hamadaさん 株式会社tacoms フルスタックエンジニア
2番目のLTは株式会社tacomsさんのHamadaさんです!ご自身ではゲームの開発も行われているそう。株式会社tacomsさんではデリバリー注文一元管理サービス「Camel」を運営されています。
公開したOSSについて
今回は、2022年に公開したDaguというOSSについてご紹介いただきました。YAMLで定義されたジョブを実行するワークフロー管理システムです。WebUIとDBがバイナリ入っているため単体で動作するものとなっています。
(アイコンがかわいい〜!)
![](https://assets.st-note.com/img/1703659143161-n3Y2Q1mSjR.png?width=1200)
公開後、スター数は980となり(すごい!)使ってくれる方が増え、バグの報告をしてくれる方や機能の追加を行ってくれる人も増えてきたそうです。
HamadaさんがDaguの開発に至った背景としては、ある業務システムのデータ処理を行うバッチ・プロセス郡が大量に動いていたことがきっかけだったそう。社内外のさまざまなシステムからデータを取得しDBに登録を行い、オンプレサーバーで300~種類のバッチ・プロセスが動作していました。
すべてのジョブをcrontabで管理し、依存関係にあるジョブは時間をずらして登録をしていました。また、サーバにログインしてログの確認やリカバリ作業をしていたことからジョブ同士の依存関係の把握が困難だったそうです。
理想的なジョブの管理状態はこの3つ。
・ジョブ同士の依存状態が明確になっている
・トラブルが起きた時にすぐにリカバリできる
・実行結果を簡単に確認できる
DAGとは
そもそもDAGとは?というところですが、「direct acyclic graph」(DAG)の略となっています。ワークフロー管理システムでは依存関係をこのDAGで表現することが多いそう。
![](https://assets.st-note.com/img/1703659730006-CX6Xj1amNG.png?width=1200)
ジョブをDAGとして扱うメリットとして、ジョブの管理が簡単になることが挙げられます。
・ジョブの依存関係を定義
→定義された依存関係をもとに自動的に実行順序を判断
・依存関係の可視化
・並列実行
今回Goを採用した理由は複数あり、シンタックスが簡潔で読みやすい点や癖がない点、簡単にクロスコンパイルできる点、標準ライブラリが充実している点、そしてgoroutineとchannelで並列処理が簡単に書ける点だったそう。ここに関してはワークフロー管理システムでは大切なポイントとのこと。
失敗したことと学び
![](https://assets.st-note.com/img/1703660171259-246Df38FkR.png?width=1200)
とはいえ、失敗も多かったそう。コントリビュータの集まりが悪く、Daguはほとんど一人で開発をしていくということになり、非常に大変だったとのこと。
その後、誰かに使われるOSSを作るにはどうしたらいいか?というところですが、既存のOSSをベースにしたり先人の知恵を頼るということが良さそうです。今後、大きなOSSにしていきたい、という考えがある場合はコントリビュータの集まりやすい方法を考えるということも気づきとしてあったそうです。
LT3: 「GoによるClean Architecture」Kiichi Isobe さん 株式会社DONUTS ソフトウェアエンジニア
最後のLTは株式会社DONUTSからIsobeさんです。株式会社DONUTSさんはクラウドサービス事業・ゲーム事業・ライブ配信事業・など多くのWebサービスを展開する企業です。
Clean Architecture
Clean Architectureとはというところですが、2012年のアンクルボブこと、ロバートマーチン氏が書いたブログの記事のタイトルが語源となっています。後に書籍化もされていて、日本語版も出版されています。
![](https://assets.st-note.com/img/1703731623288-Z4WcYZfH65.png?width=1200)
以下がClean Architectureについての解説です。
①関心事をレイヤーに分離すること
②レイヤー間の依存関係を単一方向にすること
③詳細(UI・DB)が方針(Entities)に依存すること
実際にはこの図通りに実装することだけがClean Architectureではなく、クリーンアーキテクチャを提唱したロバートマーチン氏はソフトウェア開発の目標を「ソフトウェアをソフトにすること」としているそうです。彼の書籍には開発者として、プロとしてやっていかなければならない責務であるということが一貫して述べられているそう。
実際の画面
今回は実際にGoでClean Architectureを実装した画面をお見せいただきました。(一部を抜粋して掲載しています。)
![](https://assets.st-note.com/img/1703731642648-VDDYSLcfXU.png?width=1200)
今回は基本的なアプリでの解説でしたが、実際に複雑なシステムを構築する場合には、DIコンテナ・ユーティリティ関数・ロギング・テストなど考慮事項が多くあります。現実的なClean Architectureを実装するためにはまだ多くの課題があるとのこと。
重要なことは視野を広げ、多くのことを見た上で「ソフトなソフトウェアを作る」という目標を見失わないこと。常に、個々のシステムにあった設計を考え続けるということが大切です。
まとめ
今回は初のGoというテーマでしたが「Goについての知見を深めたいと考えている」「初心者なのでいろいろ学んでみたい」という声が事前アンケートでも多くありました。非常に関心のある方の多いテーマだと感じました。今後は角度を変えて再度、Goに関する知識を吸収できる会を開催してみたいと思っています。
改めまして登壇者のみなさま、ご参加いただいたみなさま、ありがとうございました!
本年度のROSCAFEイベントはすべて終了となりました。ぜひまた、来年お会いしましょう!
今回も、最後までお読みいただきありがとうございました!
また次回の記事でお会いしましょう!
ROSCAでは、エンジニアに最適なキャリアを選択してほしいという思いから知識を持ったキャリアアドバイザーが毎日厳選したクライアントのみに絞ってお仕事のご支援をさせていただいております。
少しでも関心をお持ちいただけましたら、ぜひお問合せください。
ROSCAの話を詳しく聞きたい!興味があるという方はこちらの募集からどうぞ!
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?