外部が件数を公表しないデータ取り込みでは、内部の連番完全性と前回比で自前のチェックサムを作る
設計判断
検知器の評価
データインポート
判断
運用
外部の公表資料を定期取り込みするパイプラインでは、掲載ページに書かれた件数とパース結果の件数を照合する fail-closed ゲートが最も効く。取得と解析が独立に壊れても、外部が宣言した値と食い違えば止まるためだ。問題は、同種の資料でも件数を公表していないソースがあること。パース結果の件数を自分で数えて記録するだけでは自己参照で、何も検証していない。
代替ゲートの作り方
資料の内部に、行の欠落や重複を外から検算できる構造が残っていることが多い。表形式の一覧なら通し番号の列がその代表。
- 連番の完全性を fail-closed 条件にする。最小値から最大値まで欠番がなく、重複もないことを検証する。行の取りこぼしと重複読みはここで止まる。
- ただし連番検証は末尾切れを検知できない(1からNまで揃っているが、本来N+M件あった)。この穴は前回反映済みの件数との比較で塞ぐ。減少が一定割合を超えたら止める。増加側は正常な成長と区別できないので止めない。初回取り込みには適用しない。
- 資料内の記載日付が複数ファイルに分かれている場合、日付が揃っていることも検証条件に入れる。版の食い違う資料を黙って混ぜない。
検知器として検証する
この種のゲートは実装した時点では動作が確認されていない。故意に壊した検体を通して、期待どおり非ゼロ終了するかを確かめて初めてゲートになる。壊し方は1種類で済ませず、ゲートが担保する制約ごとに別の壊し方を用意する。
- 通し番号を1つ抜いた入力 → 連番検証で停止
- 同じ番号を2行持つ入力 → 重複検出で停止
- 前回の反映件数に対して大幅に少ない入力 → 前回比ガードで停止
- 記載日付が食い違う複数ファイル → 版不一致で停止
検体は実ファイルから採取して加工したものを使う。手組みのみだと、実データの表記ゆれ(全角半角の混在、和暦、囲み文字など)を通る保証がない。
適用条件
外部の宣言値が取れるなら、そちらを優先する。自前のゲートは代替であって上位互換ではない(資料の生成側が壊れていて連番ごとおかしいケースは検知できない)。宣言値が無いソースに限って使い、無いことをドキュメントに理由として残す。