"8100 에서 뭔가 listen 해. 귀엽네. 근데 그게 Ember 야 — 아니면 Ember 의 port 를 입은 유령이야?"
초록불 속 함정
순진한 health check 는 이래. 선언된 port 에 연결하고, 뭔가 답하면 'running' 이라 불러. 합리적으로 느껴지고 조용히 틀렸어. TCP listener 는 어떤 프로세스가 그 port 에 bind 됐다는 것만 증명해 — 기대한 product 인 건 아니라. 지난주에 안 죽은 남은 서버일 수도. port 를 먼저 잡은 다른 앱일 수도. placeholder, proxy, 완전히 무관한 프로세스일 수도. 그 하나하나가, 진실로는 거기 없는 서비스에 순진한 체크가 자신 있는 초록불을 보이게 만들어.
identity 를 증명하는 두 체크
Firelink 는 속기를 거부해서, responder identity 를 두 체크로 검증해. 첫째, port-owner 체크: office launchd 멤버는, 선언된 localhost port 가 그 job 자신의 process tree 에 소유돼야 해 — 그냥 열린 게 아니라, launchd job 이 실제로 spawn 한 프로세스가 쥔. 둘째, health-identity 체크: 선언된 health path 가 있는 멤버는 그 path 를 기대한 identity substring 으로 답해야 해 — 응답이 사실상 '응, 나 Ember 야'라고 말해야 해. 둘 다 통과하면 진짜로 도는 거야. 하나라도 실패하면 Firelink 는 불일치 detail 과 함께 unknown 을 보고해 — 절대 running 이 아니라.
왜 'unknown' 이 정직한 평결인가
identity 체크 실패에 'stopped' 를 보고하지도 않는 걸 봐. 뭔가 답하고 있어 — 그냥 옳은 것임이 증명 안 될 뿐. 그건 '죽음'이 아냐; '이게 주장하는 그것임을 확인 못 함'이야. running 이라 부르면 거짓말이고; stopped 라 불러도 거짓말이야. unknown 에 구체적 불일치를 더한 게 유일하게 정직한 답이고 — 그게 딱 사람이 '저 port 에 실제로 뭐가 앉아 있지?' 조사하러 가야 하는 걸 보는 데 필요한 state 야.