개요
동시성 원칙은 하나의 애플리케이션을 여러 작업 단위로 나누고, 필요한 만큼 프로세스나 작업자를 늘려 처리량을 확장하라는 뜻입니다. 모든 일을 하나의 긴 실행 흐름에 묶으면 장애와 병목을 분리하기 어렵습니다.
HandStack에서는 웹 요청, 계약 기반 거래, 서버 함수, 파일 처리, 관리작업, 스케줄 작업을 구분해서 생각해야 합니다. 모두 같은 ack 프로세스 안에서 시작될 수 있지만 업무 성격은 다릅 니다.
HandStack 동시성 관점
HandStack에서 동시성을 볼 때는 다음 단위를 구분합니다.
- 웹 요청: 브라우저와 API 클라이언트의 요청
- 거래 실행:
transact가 계약을 해석하고 라우팅하는 작업 - 함수 실행:
function모듈의 Node.js, C#, Python 기능 - DB 작업:
dbclient를 통한 SQL 실행 - 그래프 작업:
graphclient를 통한 Cypher 실행 - 명령 작업:
command를 통한 CLI 또는 HTTP 호출 - 프롬프트 작업:
prompter를 통한 LLM 요청과 도구 호출 - 프록시 작업:
forwarder를 통한 브라우저 컨텍스트 재사용 - 파일 작업: 업로드, 다운로드, 리포지토리 처리
- 관리작업:
task스크립트를 통한 일회성 작업 - 배포 작업: 빌드, 복사, 번들링, 재시작
동시성 설계의 핵심은 오래 걸리는 작업과 즉시 응답해야 하는 작업을 분리하는 것입니다.
확장 기준
HandStack은 모듈러 모놀리식 구조를 따르지만, 운영에서는 여러 인스턴스나 보조 프로세스를 둘 수 있습니다. 트래픽이 늘면 ack 인스턴스를 늘리거나, 배치성 작업을 별도 실행 경로로 분리할 수 있습니다.
다만 프로세스를 늘리려면 다음 전제가 필요합니다.
- 세션과 캐시가 인스턴스에 만 묶이지 않아야 합니다.
- 파일 저장소 경로와 권한이 일관되어야 합니다.
- 중복 실행되면 안 되는 작업은 잠금이나 큐 기준이 있어야 합니다.
- 로그에서 인스턴스와 요청을 구분할 수 있어야 합니다.
마치며
HandStack에서 동시성은 무조건 프로세스 수를 늘리는 문제가 아닙니다. 업무 작업의 성격을 나누고, 병목이 되는 작업을 식별하고, 안전하게 병렬화할 수 있는 경계를 만드는 것이 핵심입니다.