4편까지 대기 인원은 이렇게 살았다.
var waiting = 3;
프로세스가 죽으면 3으로 돌아간다. 데스크 화면을 뽑았다 꽂으면 줄이 없던 일이 된다.
적는다
const _statePath = 'desk-state.json';
int _load() {
final f = File(_statePath);
if (!f.existsSync()) return 3;
final m = jsonDecode(f.readAsStringSync()) as Map<String, dynamic>;
return (m['waiting'] as num).toInt();
}
void _save(int waiting) =>
File(_statePath).writeAsStringSync(jsonEncode({'waiting': waiting}));
그리고 값이 바뀔 때 부른다.
waiting -= n;
_save(waiting);
왜 전체를 다시 쓰나
값 하나 바뀌는데 파일 전체를 다시 쓴다. 비효율적이다. 그런데 이 방식에는 성질이 하나 있다.
반쯤 쓰인 기록이 생기지 않는다. 쓰기가 일어났거나 안 일어났거나 둘 중 하나다. 중간에 죽으면 옛 파일이 그대로 남는다.
부분 갱신은 그렇지 않다. 레코드 하나를 제자리에서 고치다 죽으면 어느 쪽도 아닌 파일이 남고, 다음 부팅에서 파싱이 깨진다. 그때부터는 복구가 일이 된다.
기록이 수만 건이 되면 이 방식은 못 쓴다. 그때가 DB 를 쓸 자리다. 다만 그전까지는 이게 제일 안전하다.
어느 층에 두는가
상태가 있을 수 있는 자리가 셋이다.
| 층 | 여러 화면이 같은 값을 보나 | 프로세스가 죽으면 |
|---|---|---|
| 화면 안 | 아니다 — 화면마다 다른 값 | 사라진다 |
| 서버 프로세스 | 그렇다 | 사라진다 |
| 서버 밖(파일·DB) | 그렇다 | 남는다 |
4편까지는 두 번째였다. 이번 편이 세 번째로 옮긴다.
정하지 않으면 두 번째가 된다. 그리고 그게 문제가 되는 날은 대개 밤이다.