2019春インターン振り返り ~アカツキさん編~

基本的な情報

  • 参加させていただいたところ
  • インターンの内容
    • ゲーム内仮想通貨管理サービスのサーバー周り
  • 期間
    • 3/11 ~ 3/29 (三週間)
    • 15営業日分

やったこと(細かく)

  • 課金基盤のサーバー、インフラ周りの開発

    • 使った技術
      • Go (サーバー)
      • Terraform (インフラ)
      • GCP (TaskQueue, GAE, Stackdriver)
  • shellscript, yamlファイルのlinterをCircleCIに入れ込む

    • 使った技術
      • CircleCI (CI)
      • shellcheck (linter)
      • yamllint (linter)

はじめに

自己紹介

こんにちは、飛ばすはとバスと申します。この度はアカツキさんで課金基盤のサーバサイドエンジニアとしてインターンをさせていただきました。いつも僕はGoとPythonで色々な物を作っていますが、インターンとして大きなプロダクトの中でGoを書くのはほぼ初めてのインターンになりました。

インターンに参加したきっかけ

僕は会津大学という、東京駅から行くと新幹線とローカル線で3時間ほどかかる山の中の大学で勉強をしています。会津大学は色々と珍しい大学で、公立では珍しいコンピュータ専門の単科大学です。

会津大学では、たまに企業の方々を招いてLT会を開くことがあります。

www.facebook.com

アカツキさんを知ったのは学部2年のときのLT会でした。今回のインターンでメンターをしていただいたsachaosさんがLTをしていて、「面白そうな会社だなぁ」と感じたのが当時の印象です。

Goを書き始めたのは大学三年の夏で、春休みになったしインターンでGo/サーバーの知識を深めたいと思っていたところでした。そのときにちょうどアカツキさんから「サーバーサイド(Go)のインターンに参加しませんか?」という声をかけていただけたので、参加させていただきました。

LT会などで、どのような物を作っているかどのような人たちがいるかというのがある程度わかった状態で参加できるので、安心して業務に携わることができました。

インターンの内容

バックグラウンド

アカツキさんでは、様々なタイトルのゲームを配信しています。その中でも特に大きな役割を持っているのは「課金」の部分です。 お金という大きなものを動かすために、安定性や信頼性が必要になります。 各タイトルで課金の部分を実装してもいいのですが、タイトルごとに課金部分の実装に違いが出てしまうと、いざ障害が出た時などに解決に時間がかかる可能性があります。

課金の機能をマイクロサービスとして切り出すことによってこれを解決しています。今まではアプリごとに作っていた課金周りの機能を基盤としてまとめることで障害の対応や、プラットフォームのストアの仕様のアップデートへの追従などの開発・運用をやりやすくしています。

参加したプロジェクト

マイクロサービス化した課金基盤の開発にジョインさせていただきました。今回の記事では課金基盤の開発についてお話をします。

サービスの裏側

このサービスでは、課金の情報をBigQueryに保存しています。

f:id:flying_hato_bus:20190328135541j:plain

タイトルが大きくなれば、必然的に課金も増え、BigQueryに入ってくる課金のデータも多くなります。

f:id:flying_hato_bus:20190328135630j:plain

BigQueryにデータをinsertする処理はレイテンシが高く、これにリソースを割いてはレスポンスが悪くなります。ここで登場するのがTaskQueueです。

f:id:flying_hato_bus:20190328135745p:plain

タスクキューを使用すると、アプリケーションは、タスクと呼ばれる作業をユーザー リクエストの外で非同期に実行できます。アプリがバックグラウンドで作業を実行する必要がある場合、タスクがタスクキューに追加されます。

cloud.google.com

つまり、処理にコストのかかるinsertをTaskQueueで非同期で処理をすることで、リクエスト内でinsertにかかる時間をなくすことができ、レスポンスの向上ができます。 また、TaskQueueは処理が失敗すると自動でQueueの末尾にTaskを追加し、何回でも再実行されます。これによってデータが闇に葬り去られることもなく、安定してデータを保存することができます。

僕がやったタスク

初日のメンターさんとの1on1で、インターンの中で僕が何をするかを決めました。内容としては、「TaskQueue内のレイテンシとリトライ回数を計測する」というものでした。

f:id:flying_hato_bus:20190328135957j:plain

実現したい理由

理由としては、時間やリトライ回数を計測することでどれくらい処理が重いかということを見たかったため。 TaskQueueに入った時間と、TaskQueueできちんと処理された時間の差分で時間を計測することにしました。

実装

TaskQueueに入っている時間を取得するためには (TaskQueueで処理が成功した時間) - (TaskQueueにそのタスクが入ってきた時間) で取得ができます。

また、リトライ数の取得についてはGAEがタスクをpushする際にヘッダに情報を込めて送ってくるので、これを取得することで可能でした。

ヘッダに込められている情報

  • X-AppEngine-QueueName
    • キューの名前
  • X-AppEngine-TaskName
    • タスクの名前
  • X-AppEngine-TaskRetryCount
    • このタスクが再試行された回数。この試行回数には、インスタンス数不足が原因でタスクが異常終了した試行も含まれる。
  • X-AppEngine-TaskExecutionCount
    • このタスクがこれまでに異常終了した回数。この回数には、インスタンス数不足が原因の失敗は含まれない
  • X-AppEngine-TaskETA
    • タスクの目標実行時間。1970 年 1 月 1 日からの秒数

cloud.google.com

この二つがStackdriver Loggingで見られるようになったので、Terraformを書きました。

TerraformはIaCの一つで、インスタンスなどをコードで管理しようというものです。 これを使って、上で作ったログから数値を拾ってきてログの指標にしたり、値が閾値を超えたらアラートを作成できるようになります。

個人の開発ではなかなか使うものではないですが、最近の流行りとして色々な企業で導入されていたり、色々なサービスがTerraformに対応をし始めたりと注目されていて、僕自身、Terraformに触れてみたいと感じていました。

どちらとも、先日のデプロイで本番環境で走ることになり、とてもいい体験になりました。

インターン中の生活

会津大学生は、夏休みや春休みなど、長期休みになると出稼ぎに東京へ来るのがよくあります。 今回のインターン中に、出稼ぎに来ている同じ大学の人とご飯に行ったり、古くからの友達と飲んだりと楽しい生活を送ることができました。

社員の方にお昼に誘っていただいたり、同じインターン生同士でご飯に行ったりと社内での交流も盛んで、働いていても毎日が楽しいインターンでした。

最後に

普通の大学生では作るor触れられないような大きなサービスの開発を経験して、とても勉強になりました。

3週間という期間の中で多くのことを学ぶことができ、それでいて楽しい毎日を過ごせたような気がします。 インターン期間中にお世話になったメンターのsachaosさん、インターンを調整してくださった人事の方々、同じチームの皆さんなど、多くの方に感謝の気持ちを込め、ここで今回の記事を閉めようと思います。

本当にありがとうございました。