감시 허용목록을 넓히려고 정본 채널 어휘를 확정해야 해서 관련 테이블을 전수로 집계했다.
Table of contents
Open Table of contents
상황 — 995행 전수 집계
집계는 이렇게 했다.
SELECT channel, COUNT(*) FROM distribution_clients GROUP BY channel;
distribution_clients 995행을 전부 세었으니 확정이라고 봤다.
전수 라는 말이 안심을 줬고 빠짐없이 셌으니 이 목록이 곧 정본이라고 읽은 것이다.
검증 — 소스를 다시 봤다
확정하기 전에 OrderCollectCommand 가 실제로 어디서 읽는지 봤다.
// OrderCollectCommand.php
if ($config->is_commerce) {
$channel = $config->channel; // commerce 설정 테이블
} else {
$channel = $client->channel; // 클라이언트 테이블
}
$this->emit($channel, ...);
is_commerce 에 따라 config 와 client 중 어느 쪽을 읽는지가 갈렸다.
내가 집계한 것은 그중 distribution_clients 한쪽뿐이었다. 한 커맨드 안에서도 분기에 따라 대상이 다른데 client 쪽만 본 것이다.
원인 — 절반만 봤던 것
집계한 것과 안 본 것이 is_commerce 로 갈렸다.
[집계함] 비-commerce 경로
[안 봄] commerce 경로 — 다른 테이블
전수를 셌는데 한 경로만 검증한 셈이었다.
다른 커맨드도 봤다.
// ClaimCollectCommand.php
// 채널을 DB로 덮어쓰지 않음
$this->emit($this->channelName, ...);
channelName 을 그대로 쓰고 DB 를 아예 안 읽는다.
그래서 어휘가 세 갈래였다.
클라이언트 테이블의 값
commerce 설정 테이블의 값
코드에 박힌 값
어떤 표를 집계해도 셋째는 안 나온다.
여기서 앞서 알던 규칙 하나도 흔들렸는데 채널 문자열이 반드시 표준 형태여야 한다는 것이 OrderCollectCommand 에만 성립했다. DB 를 안 읽는 커맨드는 다른 형태를 썼는데 그 규칙이 어디까지 통하는지를 확인하지 않았다.
결과 — 미확정 66개
실제로 얼마나 미확정인지 셌다.
계측 대상 이벤트 113개
미확정 66개 (58%)
미확정 이 절반을 넘었고 두 계열에 몰려 있었다.
[하려던 것] 집계 끝 → 허용목록 확대 → 배포
[한 것] 확정 취소 → 경로별 재집계
허용목록을 그대로 넓혔으면 66개가 여전히 조용히 사라진 채로 확대 완료가 됐을 것이다.
앞서 확정이라고 적어 둔 것을 취소한다고 명시했는데 그 기록을 근거로 다른 작업이 진행되면 같은 잘못이 옮겨 간다.
주의 — 닫힘 기본은 조용하다
감시 허용목록이 닫힘 기본이었다.
목록에 있음 → 통과
목록에 없음 → 버림
버릴 때 아무 신호가 없다.
채널 문자열 하나 어긋남
↓
허용목록에 없음
↓
조용히 사라짐
↓
"감시가 잘 돌고 있다"
감시가 안 되는 것을 감시로는 못 잡는다.
열림 기본이면 모르는 것이 통과해 이상한 것이 흘러들어와 눈에 띈다. 닫힘 기본은 모르는 것이 버려져 아무 일도 안 일어난다. 그래서 목록에 없어 버린 건수를 따로 세게 만들어 뒀다.
재발 방지 — 대상을 정하는 소스
채널 어휘를 확정하는 절차를 고쳤다.
① 커맨드별로 어느 테이블의 컬럼을 읽는지 소스에서 먼저 확인한다
② 경로별로 각각 전수 집계한다
③ DB 전수 집계 하나로 "검증 완료"라고 판단하지 않는다
소스가 대상을 정하고 집계는 그다음이다.
전수는 그 대상 안에서 전부라는 뜻이고 대상이 맞는지는 별개다. 집계 하나가 무엇을 확인하고 무엇을 확인하지 못하는지를 함께 적는 것이 요지였다.
정리
- 같은 이름의 컬럼을 경로마다 다른 테이블에서 읽을 수 있다
- 한 커맨드 안에서도 분기에 따라 갈린다
DB를 안 읽는 경로는 또 다른 어휘를 갖는다- 전수는 그 대상 안에서 전부라는 뜻이다
- 대상이 맞는지는 별개다
- 소스가 대상을 정하고 집계는 그다음이다
- 닫힘 기본은 버려진 것에 신호가 없어 조용하다
- 닫힘 기본을 쓰면 버린 수를 따로 센다
- 한 집계로 검증 완료라고 하지 않는다