外部仕様はこちら

/資料/外部仕様/G2G Transfer

PR

https://github.com/weseek/growi/pull/6727 external_link

内部仕様

基本方針

G2G Transfer 機能は、MongoDB 内のデータと添付ファイルを自動で移行する機能。MongoDB のデータは既存の Export/Import の機能を流用し、添付ファイルの転送は新規で実装する。

移行開始から完了までの処理フロー

  1. 移行先で発行した移行キー(Transfer key string)を body に含めて POST /_api/v3/g2g-transfer/ を叩く
  2. 移行キーをパースして TransferKey vo を生成
  3. 移行元 GROWI が移行先 GROWI の GET /_api/v3/g2g-transfer/growi-info/ を叩いてバリデーションや移行に使用する情報を取得
    • 同時に移行先で添付ファイルアップロード先ストレージに触れるかどうかチェックし、/growi-info/ のレスポンスに含める(未実装)
      • 書き込みまでチェックできるとベストだけど、めんどくさそうならとりあえず読み込み (listFiles とか) だけでも、credential の正当性はチェックできそう(syunsuke)
  4. 移行可能かをチェック
  5. 移行開始

MongoDB データの自動 Export/Import

フロー

  1. Export service で zip ファイルを生成
  2. axios で移行先 GROWI に zip ファイルを転送
  3. 解凍して Import service でデータインポートを行う

適宜適切にバリデーションを行う。

添付ファイルの自動転送

フロー

  1. Attachment document を cursor で取得
  2. 1件ずつ document に紐づいている添付ファイルを転送する

クライアントに進行状況を通知する

socket.io で随時 emit し、クライアントで進行状況を表示する

要検討項目

  • MongoDB のデータと添付ファイルを非同期的に転送するか、同期的に転送するか
    • 非同期的に行うとメモリ不足の可能性が高まるはずなので、同期的に行うのがシンプルでいいかなあとは思っている
    • リトライ時のどこまで終わっているのかのチェックも MongoDB => 添付ファイルの順でできてシンプル
    • そもそも MongoDB さえ終わっていれば GROWI は動くというのもある
    • どっちでもいいかなー(syunsuke)
    • 添付ファイルの転送は何本か並行で走らせられるようにすると、ちょっとスピードアップするかも?本数はユーザによる調整ができると良さげ(syunsuke)
      • これはやって良さそう(taichi)
  • リトライ処理
    • startTransfer 前にどこまで終わっているかを確認して必要な分だけを転送するようにする

Routes と Services の解説

Routes

移行元サーバーの Routes は pushRouter に、移行先サーバーの Routes は receiveRouter に登録している

  • receiveRouter

    • POST /
      • MongoDB の Export された zip ファイルを受け取って Import までを行う
      • /mongo に改名した方がいいかも
    • POST /attachment
      • 添付ファイルの転送の受け口
    • GET /growi-info
      • 移行先 GROWI の移行に必要な情報を計算して返す
      • 同時にストレージが使用可能かもチェックする
    • POST /generate-key
      • 移行キーを発行する
  • pushRouter

    • POST /transfer
      • 移行開始を指示する
      • 移行に必要なオプションを body に含める
      • /start-transfer の方が直感的かも。それか / でもいいかも

Service

移行元のインターフェース & 実装は interface Pusher & class G2GTransferPusherService に、移行先のインターフェース & 実装は interface Receiver & class G2GTransferReceiverService にある