HireRoo TechBlog

HireRooの技術ブログ

HireRooを支えるマイクロサービスたちのご紹介

はじめに

こんにちは!株式会社HireRooの伊藤(@icchy_san)です。

第一弾の弊社葛岡の記事でさらっと紹介されていますが、弊社ではマイクロサービスアーキテクチャでプロダクトを開発をしています。そこで本記事では、稼働しているバックエンドのサービスの関係性や、ざっくりとしたサービス概要を紹介しようと思います。各サービスの更に詳しい内容については順次ブログに出していきますので乞うご期待ください!

サービス紹介

f:id:icchy-3:20210421235903p:plain
サービスの関係図

企業様に利用してもらっているSpot選考とBatch選考という機能(これらに関してはSpot機能紹介Batch機能紹介にて紹介されています)を提供するために、図1にあるようなサービスたちが動いています。

  • Challengeサービス
    • Compileサービス
  • Projectサービス
  • Gatewayサービス
  • Authサービス
  • Companyサービス
  • Spotサービス
  • Batchサービス

各サービスについて、ざっくり理解してもらうべく、一つづつ説明していきたいと思います。

Challengeサービス

ChallengeサービスはHireRooの中で柱となるコアサービスであり、アルゴリズム形式のコーディング試験を行う上で次の機能を持っています。

  • アルゴリズムの問題データを管理
    • 問題の作成(以下 C)
    • 問題の取得(以下 R)
    • 問題の更新(以下 U)
    • 問題の削除(以下 D)
  • アルゴリズムの問題の解答ソースコードデータ・問題のヒントとなるデータを管理
    • 解答ソースコード・ヒントのCRUD
  • 提出されたソースコードをCompileサービス渡し、実行させパフォーマンスや実行結果の取得処理

Compileサービス

Compileサービスは、基本的にはChallengeから呼ばれるサブサービスで、次の2つの機能を持っています(詳細に関しては後日別記事にして紹介します)。

  • 候補者様が書いた解答コードを実行し、パフォーマンス評価する機能
  • 試験開始時にIDE上に表示するテンプレートコードを生成する機能

コードの実行を行うために、対応している言語すべてのライブラリなどを予め入れているコンテナイメージを作成し、CloudRunで走らせるという実装をしていました。

言語が追加されていくなかで徐々にイメージサイズが肥大化し、CloudRunの起動までに時間がかかるようになり、それが原因でCompileサービスが落ちるというという問題が発生し始めました。

そこで、現在のCompileサービスでは言語ごとに更にサブサービスを切り出すようにし、言語の追加も容易にできるような設計に再構成しました(図2)。

例えば、Goで課題を解いた場合は、Compileサービスにとってのサブサービスであるcompile-go(仮名)というサービスでCompileを行い、結果をCompileサービスを通して返しています。 この構成になったことで、言語追加をする際にはcompile-xxのようなサービスを作るだけでよくなりました。問題視されていたイメージサイズの肥大化も、この構成により対象言語のみのイメージになったので軽量化されました。

f:id:icchy-3:20210422000038p:plain
図2. Compileサービスの変化

Projectサービス

Projectサービスは、HireRooにおいてChallengeサービスと並ぶコアサービスであり、Challengeがアルゴリズム形式の問題を解くのに対し、フレームワークを用いたAPIサーバ構築などの少し規模の大きいコーディング試験を行うために次の機能を持っています。

  • Project用の問題データを管理
    • 問題の作成(以下 C)
    • 問題の取得(以下 R)
    • 問題の更新(以下 U)
    • 問題の削除(以下 D)
  • Projectの解答ソースコードの管理
    • 解答ソースコードのCRUD
  • 候補者用のサーバの管理
  • Service DIscovery用で利用しているService DirectoryのRecord管理

こちらのProjectサービスも非常に面白いことを行っていますので、後日ブログとして公開します。

Gatewayサービス

Gatewayサービスは、Google CloudEndpointsのバックエンドサービス用として利用しています。CloudEndpoints自体は以下のことをやってくれています。 * gRPC-webでクライアントから来たリクエストを裏側のCloudRunで稼働しているサービスに対して送ること * CloudEndpointsのESPv2はEnvoyで動いているために容易に実現できている * リクエストがFirebase Authenticationによって認証されているユーザからのものなのかをトークン検証すること * RESTのリクエストをgRPCに変換(Transcoding)

※ここで述べているESPとはプロキシのことで、ESPがnginxベースのプロキシ、ESPv2がEnvoyベースのプロキシとして提供されています。(詳しくはドキュメントを参照してください)

GatewayサービスはYAMLファイルに管理するAPIの設定を書くのみで、Proxyの構築、ドキュメントの自動生成を行ってくれるので、APIの管理コストがかなり軽減されています。

Authサービス

Authサービスは、DatabaseとしてFirestoreを用いてます。 そのため、Google Cloud Client Libraries for Goを利用して、

  • 候補者様
  • 従業員様

のデータ管理を担っています。 データ自体は、Firebase AuthenticationのAPIを用いてFirebaseからデータを取得し、その情報をFirestoreに保存するようにすることで、CRUDイベントが発火するたびに同期も行っています。

ReadとUpdateに関しては特別なことはしていないので割愛しますが、 Create/Deleteのフローに関しては次のように別のサービス(CloudFunctions)を利用しています。

  • 登録(Create)
    • Firebase Authenticationで認証すると、Cloud Functionsがトリガされ、Authサービスに対してCreateのリクエストを送ります。Authサービスはそれを受け取り、Firestoreのドキュメントに保存します。
  • 削除(Delete)
    • 候補者様(あるいは従業員様)がFirebase Authenticationから削除されると、今度は削除用のCloud Functionsがトリガされ、Authサービスに対して削除リクエストを送ります。Authサービスはそれを受け取り、Firestoreのドキュメントから対象を削除します。

また、認証方法は候補者様がGitHub、従業員様がGoogleと分かれています。従業員様の場合は所属企業情報が必要なのでHireRooに企業情報がない場合は登録できない仕様になっています。

Companyサービス

Companyサービスでは、従業員様が所属する企業様情報を管理しています。 Authサービスでも紹介しましたが、従業員様はGoogleの認証となっており、企業情報と紐づくようになっているため、このCompanyサービスで企業情報を登録します。

ユーザーの紐付けはCloud PubSubを使用し、Authサービスにユーザーが追加された際のイベントをトリガとしCompany DBを更新します。削除された際も同様で、Company DBから対象のユーザー情報を消すことで情報を常に更新しています。

Spot・Batchサービス

Spot・Batchサービスは、一言で言うなればBFF層になります。 なぜこのサービスが必要かと言うと、例えばBatch選考の詳細ページにアクセスするというユースケースを考えると、 該当ページがほしいデータは、

  • 企業様に所属している面接官の方の情報
  • 候補者様の情報
  • 選考の情報

です。

これらをフロント側が取得しようとすると、Compnayサービス、Authサービス、Challengeサービスに対してリクエストを送り、更にフロント側で整形する必要があります。 実際元々は、フロント側で整形していましたが運用していく中で、レスポンスが変わるたびにフロントも変更する必要が出てきたりと、つらさが顕著になってきたため、SpotとBatchというサービスに上記3つの情報を取得・整形させ、フロントにレスポンスを渡すよう作り変えました。結果、リクエスト数の削減とともに、フロントのコード削減の手助けをしています。

さいごに

いかがだったでしょうか? HireRooではこれらのマイクロサービスが裏で稼働しています。初期からこの数のサービスを管理できているのも、Google CloudEndpointsを始めとした素晴らしいかつ、新しいサービスを併用しつつ開発をしているからだと考えています。 今後もサービスは増減していくので、マイクロサービスに知見のある方、開発したい方を大募集しています!こちらのフォーム、もしくはTwitterのDMから連絡をいただければと思います。

今後も順次テックブログを更新していきますので、どうぞよろしくおねがいします!