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
図の説明
- システム実行: スケジューラーが5分ごとに
update:bigquery-statusコマンドをトリガーします。 - 保留中の更新を取得: コマンドは以下を含むRedisから保留中のデータを取得します:
- 状態更新が必要な商品ID
- フィルタリング用の日付範囲
- データタイプ(商品、レビュー、またはレビュー文)
- テーブル状態更新: データタイプに基づいて、対応するBigQueryテーブルで更新が実行されます:
- 商品データの場合:商品テーブルの状態を更新
- レビューデータの場合:レビューテーブルの状態を更新
- レビュー文データの場合:文テーブルの状態を更新
- すべての更新で状態フィールドを「同期済み」に変更
- 確認: BigQueryが正常な状態更新を確認
- 処理済みデータをクリア: 正常な更新後、処理済みエントリがRedisから削除される
- 完了: Redisがデータクリアを確認し、サイクルが完了
実装詳細
処理フロー
- コマンドがRedisからデータを取得(商品ID、日付範囲、データタイプ)
- データタイプに基づいて、BigQueryテーブル用の適切なクエリを構築
- 更新はバッチで実行される(デフォルト:バッチあたり100レコード)
- 正常な更新が追跡され、完了後にRedisデータがクリアされる
- コマンドは実行ごとに複数の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%)が警告をトリガー
トラブルシューティング
一般的な問題
- Redis接続問題: Redis接続とデータ形式を確認
- BigQuery権限問題: プロジェクトとデータセットの権限を確認
- タイムアウト: バッチサイズの削減またはタイムアウト制限の増加を検討
- ID欠損: 同期コマンドがRedisにIDを適切に保存していることを確認
検証手順
- Redisを確認してデータが正しく保存されていることを確認
- 処理後にBigQueryレコードの状態が更新されていることを確認
- バッチ処理成功率のログを監視
- 正常な処理後にRedisエントリがクリアされているかを確認