uvicorn 재시작 시 일어나는 일
아무 것도 안 하면 모든 WebSocket connection 이 재시작 시 code 1006 (abnormal closure) 으로 끝나. 클라가 network error 보고; 재연결 logic 발동; 다 ok. 근데 더 잘할 수 있어: system.reconnect message 보내서 클라한테 알리고, 1001 (going away) 로 깔끔히 close.
FastAPI lifespan
lifespan context manager 사용. yield 후 돌아가는 모든 게 shutdown. 모든 활성 WebSocket close 후 return — uvicorn 이 lifespan return 까지 exit 안 해.
gather 로 동시 close
10,000 connection 하나씩 close 하면 분 걸려. asyncio.gather(*close_tasks, return_exceptions=True) 로 fan out + 동시 wait. return_exceptions=True 가 나쁜 클라 하나 때문에 나머지 abort 안 되게.