Settle late TCP usage asynchronously
This commit is contained in:
@@ -15,6 +15,7 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
|
||||
- 허용된 차량 명령 TCP 전송
|
||||
- monitor 화면과 AJAX 상태 갱신
|
||||
- 사용량/요금 표시와 보정 metadata
|
||||
- 4.95초 UI timeout과 60초 사용량 정산 분리
|
||||
- TCP 실패 reason과 마지막 수신 지연 표시
|
||||
- 도어/경계/시동/공조 상태 해석
|
||||
- service worker와 PWA icon 제공
|
||||
@@ -49,6 +50,19 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
|
||||
4. 명령 코드를 허용 목록과 대조합니다.
|
||||
5. TCP 게이트웨이로 전송하고 결과와 실패 reason을 반환합니다.
|
||||
|
||||
## TCP timeout과 사용량 정산
|
||||
|
||||
차량 명령 성공/실패 판단은 UI 안정성을 위해 `TCP_TOTAL_TIMEOUT` 기본값인 4.95초를 사용합니다. 이 시간 안에 정상 응답이 없으면 API는 기존처럼 실패를 반환하므로 자동화와 UI는 즉시 재시도 여부를 판단할 수 있습니다.
|
||||
|
||||
단, 실제 모뎀이 4.95초 이후에 늦게 응답할 수 있으므로 사용량 기록은 별도로 정산합니다. 4.95초까지 정상 응답이 없고 송신이 완료된 요청은 `pcntl_fork()`로 자식 프로세스를 만들고, 같은 TCP 소켓을 최대 `TCP_USAGE_SETTLEMENT_TIMEOUT` 기본 60초까지 더 관찰합니다.
|
||||
|
||||
- 60초 안에 정상 응답이 완성되면 `late_response_after_ui_timeout`으로 송신량과 수신량을 함께 기록합니다.
|
||||
- 60초까지 응답이 없으면 `late_total_timeout_60s_sent_only`로 송신 패킷만 사용량에 반영합니다.
|
||||
- 60초 안에 일부 데이터만 오고 정상 포맷이 아니면 `late_invalid_or_partial_response`로 실제 수신된 바이트까지 기록합니다.
|
||||
- 늦은 정상 응답이 차량 상태 포맷이면 상태 DB에도 저장합니다.
|
||||
|
||||
이 구조에서 `request_id`는 UI 응답과 늦은 사용량 정산 기록을 연결하는 기준입니다. 즉 명령 재시도 로직은 4.95초 기준을 유지하고, 데이터 사용량은 최대 60초까지 늦은 수신 패킷을 반영합니다.
|
||||
|
||||
## 주요 함수/모듈
|
||||
|
||||
- `common.php`: secret 로드와 공통 DB/API 함수
|
||||
@@ -68,4 +82,4 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
|
||||
- 차량 TCP 실패 reason과 마지막 수신 지연을 확인합니다.
|
||||
- 명령별 rate limit과 감사 로그를 유지합니다.
|
||||
- 통신사 기준 데이터 사용량 보정값을 주기적으로 확인합니다.
|
||||
|
||||
- 4.95초 timeout 직후에는 사용량 기록이 즉시 생기지 않을 수 있으며, 최대 60초 뒤 늦은 정산 행이 추가될 수 있습니다.
|
||||
|
||||
Reference in New Issue
Block a user