論文・特許データのデータマイニングシステムの開発案件

プロジェクト内容

特定の論文や特許データの内容を分析するためのデータマイニングシステムの開発。

やりたいこと主な部分はデータ分析なので、その機能さえあれば要件は満たすが、一般のユーザーにも使いやすいようWebシステムとして作ることになった。
Webシステムとして動かすため、バックエンド領域ではREST APIを20本程度作ることになった。この領域を3人で対応し、自分はその中のメンバーの1人。

技術スタック

※自分が関わった範囲に限定して記載

  • プログラミング言語: Java
  • フレームワーク: Spring Boot
  • データベース: Firestore、BigQuery
  • コンテナ管理・オーケストレーション: Kubernetes(GKE)
  • クラウド: Google Cloud
  • バージョン管理: Git

主な業務内容

  • データ分析の際に使用する定義ファイルのフォーマット設計
  • Firestoreのスキーマ設計
  • バックエンド領域のシステム設計レビュー
  • APIの実装とコードレビュー
  • 手動でのシステムテスト実施

データ分析の際に使用する定義ファイルのフォーマット設計

本システムで扱う論文・特許データはxmlで構成されており、分析にあたり各種タグをどう扱うかの定義が必要だった。

タグの定義自体は別チームが用意したので、それをシステムに反映するためのフォーマットを設計した。

諸々の制約からtsvをベースにしたが、tsvでは扱いにくい部分もあり、そこは反省点。

Firestoreのスキーマ設計

バックエンドで使うデータベースがFirestoreに変更されたため、スキーマ設計を行った。

Firestoreのスキーマ設計では、ホットスポットの回避が重要。分散処理が可能なIDを設定する必要がある。しかし、システム要件として「IDはAuto Incrementにする」という条件があり、分散IDとAuto Incrementという相反する要素を組み合わせる必要があった。

解決策として、「IDのAuto Incrementを管理する専用のDocumentを作成し、アプリケーションで使用するDocumentには分散用IDとAuto Increment用IDの2つを持たせる方法」を採用して、要件を満たした。

詳細は、Firestoreで連番IDを実装する方法を参照。

バックエンド領域のシステム設計レビュー

チームで設計領域を分担し、設計は各自で行い、それをメンバー全員でレビューして成果物を仕上げるという方法を取った。

バックエンド領域では、DataflowやFirestoreなどクラウドリソースの実行状態の整合性を保ちながら処理を行う点(分散トランザクションの類)が難しく、異常系のパターン列挙とその解消パターンの設計が特に困難だった。

設計フェーズは1ヶ月半あったが、この部分だけで2週間以上を費やした。

「異常が発生した場合、処理の状態を戻さずに終了し、後でバッチ処理で異常を救う」という方針に至り、複雑さを抑えて設計を完了させた。

APIの実装とコードレビュー

Clean ArchitectureをベースにREST APIを実装。ここでも各自でAPIを実装し、メンバー全員でレビューする体制で進めた。

当初の予定に対して、設計と実装フェーズで時間を多く使ってしまったが(元々の見積もりよりアプリの実装量が多かった)、品質を優先してしっかりレビューを行った。

結果として、後のテスト工程でバックエンド領域の不具合は1件(軽微なもの)しか発生せず、高品質なAPIを作ることに成功。バックエンド領域でテスト工程の追加はほぼなかった。

手動でのシステムテスト実施

ユニットテストではカバーできない部分を手動でテスト。テストシナリオに沿ってシステムを操作し、エビデンスとしてスクリーンショットを撮る方法を採用した。

重要な工程ではあるが、全くモチベーションが上がらず、自分はこの手の作業が好きではないと再確認した。