Move TCP settlement to systemd worker
This commit is contained in:
@@ -33,12 +33,14 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
|
||||
- `monitor.php`: 모니터링 화면과 AJAX 응답
|
||||
- `common.php`: 외부 secret 로드와 공통 DB/API 함수
|
||||
- `collector_se.php`: 상태 수집 CLI/cron
|
||||
- `tcp_worker.php`: TCP 큐 처리와 늦은 사용량 정산 worker
|
||||
- `car-tcp-worker.service`: systemd service 예시
|
||||
- `sw.js`: service worker
|
||||
- `assets/`: 아이콘과 정적 자산
|
||||
|
||||
## 데이터/저장소
|
||||
|
||||
- Car DB tables: 차량 상태, 로그, 차트용 기록
|
||||
- Car DB tables: 차량 상태, 로그, 차트용 기록, TCP 요청 큐
|
||||
- 사용량 수집값과 월별 보정 기준
|
||||
- `/home/seo/secret/car.php`: TCP, DB, token, 허용 IP 설정
|
||||
|
||||
@@ -48,13 +50,15 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
|
||||
2. `monitor.php`는 상태 AJAX와 사용량 AJAX를 분리해 갱신합니다.
|
||||
3. 제어 요청은 token/IP 정책을 검증합니다.
|
||||
4. 명령 코드를 허용 목록과 대조합니다.
|
||||
5. TCP 게이트웨이로 전송하고 결과와 실패 reason을 반환합니다.
|
||||
5. 요청을 `car_tcp_request_queue`에 저장합니다.
|
||||
6. `car-tcp-worker.service`가 큐를 처리하며 TCP 게이트웨이로 전송합니다.
|
||||
7. API는 큐 상태를 4.95초까지만 기다린 뒤 결과 또는 timeout을 반환합니다.
|
||||
|
||||
## TCP timeout과 사용량 정산
|
||||
|
||||
차량 명령 성공/실패 판단은 UI 안정성을 위해 `TCP_TOTAL_TIMEOUT` 기본값인 4.95초를 사용합니다. 이 시간 안에 정상 응답이 없으면 API는 기존처럼 실패를 반환하므로 자동화와 UI는 즉시 재시도 여부를 판단할 수 있습니다.
|
||||
|
||||
단, 실제 모뎀이 4.95초 이후에 늦게 응답할 수 있으므로 사용량 기록은 별도로 정산합니다. 4.95초까지 정상 응답이 없고 송신이 완료된 요청은 `pcntl_fork()`로 자식 프로세스를 만들고, 같은 TCP 소켓을 최대 `TCP_USAGE_SETTLEMENT_TIMEOUT` 기본 60초까지 더 관찰합니다.
|
||||
단, 실제 모뎀이 4.95초 이후에 늦게 응답할 수 있으므로 사용량 기록은 별도로 정산합니다. API는 요청을 DB 큐에 넣고 4.95초까지만 기다립니다. `car-tcp-worker.service`는 해당 요청의 TCP 연결을 직접 열고, UI timeout 이후에도 같은 소켓을 최대 `TCP_USAGE_SETTLEMENT_TIMEOUT` 기본 60초까지 더 관찰합니다.
|
||||
|
||||
- 60초 안에 정상 응답이 완성되면 `late_response_after_ui_timeout`으로 송신량과 수신량을 함께 기록합니다.
|
||||
- 60초까지 응답이 없으면 `late_total_timeout_60s_sent_only`로 송신 패킷만 사용량에 반영합니다.
|
||||
@@ -63,12 +67,26 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
|
||||
|
||||
이 구조에서 `request_id`는 UI 응답과 늦은 사용량 정산 기록을 연결하는 기준입니다. 즉 명령 재시도 로직은 4.95초 기준을 유지하고, 데이터 사용량은 최대 60초까지 늦은 수신 패킷을 반영합니다.
|
||||
|
||||
## systemd worker
|
||||
|
||||
설치 파일은 `car-tcp-worker.service`입니다.
|
||||
|
||||
```bash
|
||||
cp /var/www/seoul/car/car-tcp-worker.service /etc/systemd/system/car-tcp-worker.service
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now car-tcp-worker.service
|
||||
systemctl status car-tcp-worker.service
|
||||
```
|
||||
|
||||
큐 테이블은 코드에서 자동 생성합니다. Worker가 중지되면 API 요청은 큐에 쌓이지만 4.95초 안에 처리되지 않아 실패로 반환될 수 있습니다. 안전을 위해 worker가 뒤늦게 오래된 queued 요청을 발견하면 실제 TCP 송신 없이 `queue_expired_before_send`로 만료 처리합니다.
|
||||
|
||||
## 주요 함수/모듈
|
||||
|
||||
- `common.php`: secret 로드와 공통 DB/API 함수
|
||||
- `api.php`: 상태 조회와 명령 전송
|
||||
- `monitor.php`: 화면 렌더링과 AJAX 응답
|
||||
- `collector_se.php`: 상태 수집과 중복 실행 방지
|
||||
- `tcp_worker.php`: TCP 요청 큐 처리와 60초 사용량 정산
|
||||
|
||||
## 보안
|
||||
|
||||
@@ -83,3 +101,4 @@ Car는 차량 모뎀/게이트웨이에서 받은 상태를 수집해 DB에 저
|
||||
- 명령별 rate limit과 감사 로그를 유지합니다.
|
||||
- 통신사 기준 데이터 사용량 보정값을 주기적으로 확인합니다.
|
||||
- 4.95초 timeout 직후에는 사용량 기록이 즉시 생기지 않을 수 있으며, 최대 60초 뒤 늦은 정산 행이 추가될 수 있습니다.
|
||||
- `systemctl status car-tcp-worker.service`와 `journalctl -u car-tcp-worker.service`로 worker 상태를 확인합니다.
|
||||
|
||||
Reference in New Issue
Block a user