BigQuery状態更新

コマンドシグネチャ

php artisan update:bigquery-status

目的

このコマンドは、同期コマンドによって処理された後、BigQueryテーブル内のレコードの状態を更新します。処理されたレコードIDが保存されているRedisからデータを読み取り、その後BigQuery内の対応するレコードの状態を「同期済み」に設定して更新します。

シーケンス図

sequenceDiagram
    participant System
    participant StatusCommand as update:bigquery-status
    participant Redis
    participant BigQuery
    
    Note over System,BigQuery: BigQuery状態更新フロー
    
    rect rgb(200, 255, 200)
    Note right of System: 5分ごと
    System->>StatusCommand: 実行
    StatusCommand->>Redis: 保留中の更新を取得
    Redis-->>StatusCommand: 商品ID、日付範囲、データタイプを返す
    
    StatusCommand->>BigQuery: テーブル状態更新(商品/レビュー/文)
    BigQuery-->>StatusCommand: 更新確認
    
    StatusCommand->>Redis: 処理済みデータをクリア
    Redis-->>StatusCommand: クリア確認
    end

図の説明

  1. システム実行: スケジューラーが5分ごとにupdate:bigquery-statusコマンドをトリガーします。
  2. 保留中の更新を取得: コマンドは以下を含むRedisから保留中のデータを取得します:
    • 状態更新が必要な商品ID
    • フィルタリング用の日付範囲
    • データタイプ(商品、レビュー、またはレビュー文)
  3. テーブル状態更新: データタイプに基づいて、対応するBigQueryテーブルで更新が実行されます:
    • 商品データの場合:商品テーブルの状態を更新
    • レビューデータの場合:レビューテーブルの状態を更新
    • レビュー文データの場合:文テーブルの状態を更新
    • すべての更新で状態フィールドを「同期済み」に変更
  4. 確認: BigQueryが正常な状態更新を確認
  5. 処理済みデータをクリア: 正常な更新後、処理済みエントリがRedisから削除される
  6. 完了: Redisがデータクリアを確認し、サイクルが完了

実装詳細

処理フロー

  1. コマンドがRedisからデータを取得(商品ID、日付範囲、データタイプ)
  2. データタイプに基づいて、BigQueryテーブル用の適切なクエリを構築
  3. 更新はバッチで実行される(デフォルト:バッチあたり100レコード)
  4. 正常な更新が追跡され、完了後にRedisデータがクリアされる
  5. コマンドは実行ごとに複数のRedisエントリを処理(設定された制限)

パラメータ

コマンドラインパラメータはありません。設定は環境変数で処理されます:

  • GCP_BQ_MAX_NUMBER_EXECUTE_UPDATE_STATUS: 実行ごとに処理するRedisエントリの最大数

頻度

5分ごと

依存関係

  • 商品IDとメタデータを保存するためのRedis
  • 状態更新のためのBigQueryアクセス
  • 状態フィールド付きのBigQueryテーブルスキーマ
  • 同期コマンドの以前の正常実行

出力

コマンドは直接データベーステーブルに出力しませんが、BigQueryテーブルの状態フィールドを更新します:

  • 以下の処理済みレコードのstatusフィールドを"Synced"に更新:
    • BigQuery商品テーブル
    • BigQueryレビューテーブル
    • BigQueryレビュー文テーブル
    • BigQuery商品カテゴリランキングテーブル
    • BigQuery商品検索クエリランキングテーブル

エラーハンドリング

バッチ処理

  • 更新はタイムアウトを防ぐためにバッチで処理される
  • いずれかのバッチが失敗した場合、他のバッチは処理を続行
  • 成功率が計算され報告される

ログ記録

  • 各テーブルの処理開始/終了の詳細ログ
  • マルチバッチ操作の進捗ログ
  • デバッグ用のファイルと行情報付きのエラーログ

Slack通知

  • BigQuery Slackチャンネルにエラー通知を送信
  • 部分成功シナリオの成功率報告
  • 低成功率アラート(成功率 < 80%)が警告をトリガー

トラブルシューティング

一般的な問題

  1. Redis接続問題: Redis接続とデータ形式を確認
  2. BigQuery権限問題: プロジェクトとデータセットの権限を確認
  3. タイムアウト: バッチサイズの削減またはタイムアウト制限の増加を検討
  4. ID欠損: 同期コマンドがRedisにIDを適切に保存していることを確認

検証手順

  1. Redisを確認してデータが正しく保存されていることを確認
  2. 処理後にBigQueryレコードの状態が更新されていることを確認
  3. バッチ処理成功率のログを監視
  4. 正常な処理後にRedisエントリがクリアされているかを確認