COLOPL Tech Blog

コロプラのエンジニアブログです

コロプラ技術勉強会の紹介

今回はコロプラが技術共有・発信を目的として取り組んでいる、社内および社外に向けての技術勉強会について紹介させていただきます。

COLOPL Tech コミュニティについて

これまで外部講演での登壇などが主な情報発信の手段でしたが、2022年よりコロプラconnpassグループを開設いたしました。コロプラの持つゲーム開発・運用におけるバックエンド/インフラに関する技術・ノウハウの発表を行っています。

これまで

www.youtube.com

  • ゲーム運用におけるk8s
  • LCE (Launch Coordination Engineer) の取り組み

 

www.youtube.com

  • SRE (Site Reliability Engineering)の取り組み
  • モニタリングツールの活用

についての発表が行われました。資料及び動画アーカイブ公開していますので、気になる方は見ていただければと思います。

 

またこのブログ特別に今後発表予定の概要を一部公開いたします。

  • Spanner 導入時の話
  • Spanner 開発・運用ノウハウ
  • 内製のリアルタイム通信エンジン『prizm』
  • コロプラでのLaravel/PHPについて
  • ゲーム開発におけるノーメンテナンス運用

お楽しみに!

このブログでは、発表の紹介とともに、答えきれなかった質問への回答や内容の深堀りなどを発表後に掲載する予定です。発表とあわせてブログも閲覧していただければと思います。

 

株式会社コロプラ - connpass

COLOPL Tech Channel - YouTube

COLOPL_Tech (@colopl_tech) | Twitter

社内勉強会について

社内に向けての勉強会は、これまで勉強会・LT会・輪読会などが不定期に行われていました。昨今のリモート環境への変化に伴い、会社および他プロジェクトにおける取り組みを知る機会が減ったと感じていました。その課題を解決するために、コロプラでは情報・ナレッジ共有の場として社内勉強会への取り組みを強化してきました。現在はエンジニアについて発信したい・発表が聞きたいという声を第一にし、定期開催しています。

実際に行われた勉強会の一部をここで紹介させていただきます。

内製のリアルタイム通信エンジン『prizm』

リアルタイム通信を用いたゲーム開発に『prizm』という内製のエンジンの紹介とハンズオンとしてのチュートリアルを実施いたしました。

こちらについては、今後COLOPL Techチャンネルでも発表予定となります。

k8s勉強会

Kubernetes勉強会をインフラエンジニアの協力のもとバックエンドエンジニア向けに実施し、基礎的な部分から、デプロイフローの解説などをしていただきました。他領域に対する知識を深め、業務の幅やインフラ・バックエンドエンジニアとの円滑なコミュニケーションを生む目的として開催しました。

LCEと『ユージェネ』ローンチについて

横断チームのLCE (Launch Coordination Engineers TEAM) の紹介および2021年4月21日にローンチされた『ユージェネ』のローンチに向けての対応や負荷対策について共有しました。

『ユージェネ』の配信技術と裏側について

『ユージェネ』はライブ配信とゲームを組み合わせた新ジャンルのゲームとなり、そのコアとなる配信技術について、新技術の実装にあたっての苦悩や遍歴の共有をしました。

ゲーム業界におけるサーバー技術の今後について (HTTP/2,HTTP/3,QUIC,WebRTC)

最新技術の紹介から始まり、今後ゲーム業界におけるサーバー技術で何が求められるのかを紹介していただきました。バックエンドエンジニアとして未来を見据え、技術へのアンテナを張る機会を与えるような勉強会でした。

 

f:id:kevinnn:20220107164518p:plain

まとめ

今回コロプラの技術勉強会事情について紹介させていただきました。

社内勉強会を通して情報共有と成長を促し、始動したブログと技術勉強会を通して、コロプラの技術発信を活性化していけたらと思っています。

水平/垂直分割されたRDBMSを便利に検索するためのツールを内製した話

コロプラでは現在新規開発のDBとしてGoogle Cloud Spannerの採用を積極的に行っていますが、それ以前はMySQLを採用し新規サービスを提供してきました。現在も運用中の多くのタイトルでMySQLが利用されています。

MySQLを利用しているサービスは規模によっては垂直/水平分割を併用して運用しています。

分割は負荷に強くなる一方で、不具合の調査などでSQLを用いてデータを調査するなどの運用時のオペレーションのコストがあがってしまいます。

コロプラでは分割されたDBでSQLを用いた調査などの運用業務の改善を社内独自のツールを作って多少なり緩和しているというお話をさせていただきます。

 

紹介が遅れましたが、コロプラのロン毛といいます。普段は横断系のチームで業務をさせていただいています。

ツールの概要

mysqlコマンドになるべく似せたCUIのツールです。

分割されたMySQLにクエリを投げることに特化しており、名前はNite(ナイト)といいます。※1

Pythonで開発されています。※2

設定ファイルに接続情報を書くことで複数のDBへの接続を簡単に1プロセス上で行えるようになっています。

基本的には参照クエリ専用として作られており、社内ではリードオンリーなユーザーで接続しています。※3

機能説明

いろいろな機能があるのですが、特徴的な機能は大きく下記の3つです。

  1. 1プロセスで複数DBへ接続できる
  2. 水平分割されたDBへの横断検索機能
  3. 検索結果への再検索

簡単ではありますが、各機能について説明させていただきます。

f:id:yuichrmt:20220111170449p:plain

このようなデータベース構成のサービスがある想定

1プロセスで複数DBへ接続できる

f:id:yuichrmt:20220111180132g:plain

接続先をプロセス内で切り替える

設定ファイルに記載されたDBへの接続をシンプルなコマンドで実現することができます。設定ファイルへの接続はネストして記載できるので水平/垂直分割をわかりやすく設定できます。

水平分割されたDBについては別途グループ化しておくことで水平分割したDBへの検索が便利に行うことができます。

対話形式になっているのですが、DBを選択するモードと、検索するモードなどいくつかのモードに合わせて利用できるコマンドが決まっています。

f:id:yuichrmt:20220111171120p:plain

DB設定は入れ子にできる(記事のときは同一ホストですが、別ホストのDBで動作します)

水平分割されたDBへの横断検索機能

f:id:yuichrmt:20220111180410g:plain

水平分割されたDBの同一テーブルを検索

Niteで一番メインの機能です。

複数DBを一気に選択し(階層以下のDBを検索する際は!をつける)クエリを実行すると、選択されたDBに対して並列でクエリを実行し、結果をまとめて表示することが可能です。

どのDBから検索された結果であるのか、というのをわかりやすく表示するために設定されているDBの名前が検索結果に_db_name_というカラムで追加されます。

 

ここで問題になるのは、いわゆる集計系のクエリの結果なのですが、SQL構文を解釈するのは難易度が非常に高いので、基本は入力されたクエリを各DBに投げた結果をマージするのみというシンプルな作りにしています。

集計関数を使っているんだから、すべてのデータを集計してほしいところですが、DBごとの結果が複数返ってくるので、これではまだ求めている結果は得られていません。

次に説明させていただく「検索結果の再検索」の機能によってある程度のことはこのツールで対応できるようにしています。

検索結果への再検索

f:id:yuichrmt:20220111181744g:plain

各DBでカウントした結果をNiteの中でSUMする例

Niteの中にある非常に意欲的な機能です。

検索結果をローカル上のsqliteに新規テーブルとして名前をつけて取り込むことができます。※4

この機能を利用することで、上述させていただいた水平分割されたDBへの集計の検索結果に対しての再集計を実現できます。検索結果の再集計をSQLで、しかも同じプロセス内で行うことができます。

水平分割されたDB内のすべてのデータの平均値をとりたい場合などは、単純に平均値の平均値を算出するだと結果が正確ではないので、各DBで件数と合計値を検索し、合計値を総件数で割って出す必要があります。

また上位100などのランキングのようなデータを検索したい場合には、各DBで上位100を取ってきてマージして、上位100件を再度ランキングする必要があります。

 

利用者側は分散されたDBに対しての操作を理解している必要がありますが、同一プロセス内でかつSQLで検索結果を再検索できるのは、慣れてしまえば非常に便利です。

f:id:yuichrmt:20220111182002g:plain

「再検索」の機能を用いて垂直分割されたマスターデータと水平分割されたデータをジョインする例

その他の機能

上記で説明した以外にも

・検索結果の一部を次のクエリに利用する機能

DBをまたぐケースのサブクエリの代わりとして利用するイメージです

 

・マクロ機能

よく行う「検索結果への再検索」の流れをマクロとしてファイルに書き出して、再利用などできる

 

・タブキーによる補完

DB切替時にテーブル名、カラム名を読み込んで補完候補に入れている

 

など社内での運用に耐えられるように様々な機能が追加されています。

 

欠点

このツールの欠点はいくつかあるのですが、一番大きい欠点は学習コストだと思っています。

説明のアニメーションを見ていただいた方はわかると思うのですが、mysqlコマンドにはないモードの概念や、(簡単にするように心がけたつもりですが)専用のコマンドを複数覚えなければ快適には利用できません。

導入を検討してもらえそうなプロジェクトには操作の説明会を開催し、導入コストを下げるなど欠点を補う努力をしていました。

 

最後に

Google Cloud Spannerの採用が進んできており分割されたMySQLの運用割合が減ってきたこと、利用者の要望への対応がほぼ完了したことなどから現在は新機能の追加などは行われておりません。特定のことを便利に行うためのツールとしては完成したと言えるのかなと思っています。

 

この記事を書かせていただくにあたり、gitの更新履歴を見たのですが、2017年11月に開発を開始して上記で紹介したような主要な機能は半月ほどで開発を行っていたようです。なかなかに入り組んだコードになっているのですが、短期間での開発と考えれば納得ですね。※5

最初のころはオープンソースにしたいな、とかMySQL以外のRDBMSでも使えるようにしたいなという高い志もあったのですが、業務を改善するためにとにかく早く開発する方向に振り切りました。※6

それ以降は社内独自の構成やMySQL独自の問題への対応を開発途中からはためらいなく取り込んだため社外に公開できるツールに至りませんでした。

今回コロプラのエンジニアブログが開設されるにあたり、アイディアを公開することで、開発当初の「オープンソースにしてエンジニアコミュニテイに貢献したい」という思いを少しでも消化できたらなと思い紹介させていただいた次第です。

 

以上、業務改善のためのツールを作ったお話でした。

最後まで読んでいただきありがとうございます。



※1  水平分割されたDBでの障害調査が大変だった日の夜(night)に衝動的に開発しはじめたのが名前の由来です。筆者はnightという綴りを75%ぐらいの確率でtypoする体質なので綴りを変更しています。

※2 ツールが使われるサーバー上でデフォルトで入っている言語を選定したというのが表向きの理由で、筆者が一番得意な言語を使ったというのが本当の理由です。

※3 更新権限のあるユーザーでDBに接続すれば更新もできてしまうのですが、並列でクエリを投げる機能を利用した際に一部のDBでエラーが起きたときのハンドリングをどうするかはケースバイケースになってしまうと考えたため、更新をサポートしないという割り切りをしています。

※4 sqliteではなくMySQLにするとRDBMSによる構文の差を気にしなくて良いなというアイディアもあったのですが、環境構築の容易さからsqliteを選択しました。

※5 社内のコードを読んだことがある人に対しての完全に純粋な自己擁護です。

※6 言い訳がましく書いてますが、つまるところ両立させる技術力がなかったという話です。

技術ブログはじめました

こんにちは。

光栄にも1エントリ目を書かせていただくことになったコロプラの菅井です。

 

この度、コロプラの “COLOPL Tech” を立ち上げさせていただきました。

コロプラスマホ向けゲームを中心とした開発を行なっていますので、ゲームを支える技術や組織にまつわる話など色々発信していきたいなと思っています。

 

会社が設立して14年目をむかえたのですが、なぜ今なのか。という話ですが、機運が高まったの一言に尽きます。

コロナ禍におけるリモートを活用した社内勉強会や他社さんとの交流会などクローズド向けの発信をコツコツと行っていました。

そんな中、ブログはやっぱり欲しいよね。といった、社内の機運が高まりブログの開設に繋がりました。

 

当然のことながら、

  • コロプラのことを知っていただきたい
  • 発信する機会を増やすことでアウトプットの質を高めたい

ということで頑張っていきたいなと思っています。

 

せっかくですので、最後に直近行なったイベントなどのご紹介をさせていただきます。

▼ Cloud Native Lounge #3「Kubernetesで実現する大規模サービス基盤運用」

https://www.youtube.com/watch?v=j5MprqRXiwM

▼ 高負荷/トラフィックなゲームの運用を支えるSRE

https://colopl.connpass.com/event/232304/

(connpass ぜひフォローしてください!)

 

頑張って更新していきますので、ウォッチしていただけると嬉しいです。

今後ともよろしくお願いします!