以前のモノリシック アプリケーションから始める場合、切り分けて、別のマイクロサービスに移行できる部分を見つける必要があります。多くの場合、適切に構成されたモノリシック アプリは非常に自然に区分され、サービスクラスはデータ ストレージおよびビジネス ロジックのレイヤへのインターフェースとしてすぐに機能します。このようなクラスは、クライアントの呼び出しをマイクロサービスに接続する場所として理想的です。
モノリシック アプリでの機能の分離
アプリをどのように分割するかについては、次のように、いくつかのアプローチをとることができます。
- アプリケーション内で分離できるビジネス ロジックを探します。
- 静的コード解析ツールを使用してセクションを特定するなどの手法で、自然に分離されているコードを見つけます。
- アプリケーション内の他の部分とは異なるスケーリング構成設定やメモリ要件を使用するメリットがあると考えられるロジックを探します。これにより、コストが削減され、リソース利用率が向上することがあります。
不自然な依存関係を取り除くため、コードのリファクタリングが必要になることがあります。アプリを別個のサービスに分割する前に、従来のコードでリファクタリングを実行し、本番環境にデプロイしてみることをおすすめします。
マイクロサービスの共通部分には次のようなものがあります。
- ユーザーまたはアカウント情報
- 承認およびセッション管理
- 設定または構成設定
- 通知および通信サービス
- 写真とメディア(特にメタデータ)
- タスクキュー ワーカー
アプリの移行手順
一連のクラスがマイクロサービスの候補として特定されたら、次の手順を実施します。
- ロールバックを容易にするため、既存のコードはそのままにし、以前のアプリケーションで運用できる状態にしておきます。
- 新しいコード リポジトリを作成するか、既存のリポジトリに 1 つ以上のサブディレクトリを作成します。
- クラスを新しい場所にコピーします。
- HTTP API フックを提供し、レスポンス ドキュメントを正しい方法でフォーマットするビューレイヤを記述します。
- 新しいコードを別のアプリケーションとして定式化します(
app.yaml
を作成する)。 - 新しいマイクロサービスをサービスまたは別のプロジェクトとしてデプロイします。
- コードをテストして、正しく機能することを確認します。
- 以前のアプリケーションから新しいマイクロサービスにデータを移行します。後述の説明をご覧ください。
- 新しいマイクロサービス アプリケーションを使用するように以前のアプリケーションを変更します。
- 変更した以前のアプリケーションをデプロイします。
- すべてが想定どおりに動作し、以前のアプリケーションにロールバックする必要がないことを確認します。
- 不要になったコードを以前のアプリケーションから削除します。
ライブ アプリケーションでのデータ移行
ライブ アプリケーションでのデータ移行には注意が必要で、ユーザーの状況に大きく依存します。多くの場合、ロールフォワードとロールバックを容易にするため、以前の Cloud Datastore エンティティと新しい Cloud Datastore エンティティの両方に値を入力するコードを記述し(マイクロサービスでテンポラリ API を使用して実行できる場合があります)、その後、既存のデータセットを MapReduce などとして移行するコードを記述する必要があります。一般的に、このプロセスには一定量のテンポラリ コードと冗長データが含まれます。状況の詳細によっては、リリース後にキャッチアップのためのデータ移行も実行しなければならない可能性があります。新しいデータを古いデータで上書きしないように注意してください。
大変な作業であるように感じられるかと思いますが、これは普通のことであり、新しいマイクロサービスへのカットオーバーが失敗した場合にロールフォワードおよびロールバックを実行できるようにしておくことが重要です。すべてが正しく移行され、すべてが想定どおりに動作することを確認して初めて、テンポラリ コードを削除したり、古い保存場所からデータを削除したりすることができます。途中で必ずバックアップを作成してください。
次のステップ
- App Engine のマイクロサービス アーキテクチャの概要を確認します。
- App Engine でマイクロサービスを使用する開発環境、テスト環境、QA 環境、ステージング環境、本番環境を作成して名前を付ける方法を確認します。
- マイクロサービス間で通信する API を設計するためのおすすめの方法を確認します。
- マイクロサービスのパフォーマンスを高めるためのベスト プラクティスを確認します。