← 목록
기타 2026-06-14 4KB 읽기 4분

티옴타 세션 매칭 브릿지 + 채팅 정상화 (2026-06-14)

개요

"tiomta.com 정상 서비스 + API 없이 질문을 각 세션이 매칭해 답하게" 요청. 검토 중 사용자 채팅이 실제로 깨져 있던 것을 발견·복구하고, 한선씨 정본 라우터(:9789)에 세션 브릿지(큐+claim+answer) 를 추가. Gemini는 항상 폴백(무중단).

무엇을 했는지

1. 깨진 채팅 복구 (정상화)

  • 증상: 프런트(public/index.html)가 /api/consult/startR: jobId 받고 /api/consult/poll/R:... 폴링.
하지만 tiomta server.js poll 핸들러에 R: 분기가 없어 즉시 job_not_found → 사용자에게 "연결 불안정" 에러. sync /api/consult만 동작, 정작 프런트가 쓰는 async 경로가 전멸 상태였음.
  • 수정: server.js consult/poll 에 R: 접두 → :9789 /api/ai/poll/로 프록시. 일시오류는 pending 유지(에러로 안 끊음).
  • 검증: 로컬·게이트웨이(:443) 종단 모두 ✅ (이전 전멸 → 복구).

2. 세션 브릿지 (개선 — API 없는 세션 매칭)

한선씨 정본에 큐 기반 매칭 추가:
  • AI서버.한선: /api/ai/queue(대기수+세션활성) · /api/ai/claim(질문1건 가져감) · /api/ai/answer(답 기록)
  • 크라우니AI라우터.한선: 잡클레임/잡답변/큐길이/_세션살아있나 + AI응답시작 큐 기록 + 세션우선 폴백
  • 하이브리드: 세션 활성(heartbeat<15s)이면 Gemini 12초 지연(세션 우선권), 없으면 즉시(무회귀).
세션이 .out 쓰면 Gemini 스킵. 세션 못 답하면 Gemini backstop.
  • 실증: Claude 세션이 tiomta 번아웃 질문을 claim→직접 답변→사용자 수신. API 호출 0건.

작업 중 발견·수정한 한선씨/VM 함정 (중요)

  1. 파일목록("/tmp") 깨짐 — 길이 4095, 모든 항목 "0"(파일명 아님). 대량 디렉토리에서 무용.
→ 셸 ls -1tr /tmp/aijob_*.q > 파일읽기 (체계 stdout 우회).
  1. 체계()는 리다이렉트 없는 백그라운드 자식의 파이프 닫힘까지 블록 (popen). sleep 12 & → 12초 멈춤.
→ 서브셸에 </dev/null >/dev/null 2>&1 & 필수.
  1. Content-Length 없으면 자식이 상속한 소켓 fd로 클라가 EOF 대기 → 응답 지연.
_바이트수(UTF-8 코드값 기반) 로 Content-Length 명시. 한글 잘림도 동시 해결.
  1. 한선씨 JSON파싱\uXXXX 유니코드 이스케이프 미디코드 → 워커는 답을 raw UTF-8(ensure_ascii=False)로 POST.
  2. Gemini 폴백이 .q 미제거 → 답한 잡이 세션 큐에 잔류. → 폴백 끝에 rm -f .q.
  3. macOS /tmp=심볼릭링크find /tmp -maxdepth 1은 안 들어감(0건 오인). 정리는 셸 글로브 rm /tmp/aijob_*.

관련 파일

  • /Users/ef/crowny-ai-router/AI서버.한선 — 라우트(claim/answer/queue) + Content-Length
  • /Users/ef/CrownyOS/crownyc/libs/크라우니AI라우터.한선 — 큐/claim/answer/세션우선 폴백
  • /Users/ef/crowny-tiomta/server.js — consult/poll R: 프록시 (1774 부근)
  • /Users/ef/crowny-ai-router/세션워커.md — 워커 가이드(/loop 사용법)
  • 스택: /Users/ef/crowny-infra/crowny-stack.yaml crowny-ai-router (소스서 재컴파일)

배포/검증 상태

  • :9789 재배포 ✅ (health ok, gemini true) · tiomta 재배포 ✅
  • 세션우선 경로 ✅ · Gemini 폴백 ✅ · 사용자 채팅(:443) ✅ · 세션 실답변 ✅

잔여 이슈

  • .claimed 파일이 claim 후 미답변 시 잔류(누수 경미) → TTL 청소기 후속 가능.
  • jobId가 현재시간()(초) 기반 → 동일 초 동시요청 충돌 가능(저트래픽이라 보류).
  • 워커 자동화: 헤드리스 claude -p는 크레딧 소진으로 막힘 → 워커=상주 세션(/loop)이 정답.