4.3 KiB
4.3 KiB
type, tags, status, research_target
| type | tags | status | research_target | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| research |
|
open | 23·24서버 에이전트가 NAS 파일을 동시 편집할 때 덮어쓰기 없이 실시간 협업하는 기술 옵션 조사 |
260323 에이전트 간 실시간 공유 편집·동시성 제어 리서치
목적
- NAS(CIFS) 환경의 last-write-wins 문제를 넘어, 에이전트 간 실시간 동시 편집이 가능한 기술을 조사한다.
- 파일을 '저장'하는 방식에서 '상태를 동기화'하는 방식으로 전환하는 경로를 확인한다.
배경
현재 23·24서버는 NAS(/mnt/nas, CIFS)를 공유 마운트하고 있다. 파일 단위 읽기/쓰기는 되지만, 두 서버가 동시에 같은 파일을 쓰면 마지막 저장이 덮어쓴다. 잠금(lock)은 CIFS가 지원하나 에이전트 레벨에서 관리되지 않는다.
아이디어 문서에서 파일명 분리·섹션 분리로 충돌을 회피하는 규칙을 정했으나, 이는 동시성 제어가 아니라 충돌 회피다.
사실 (Facts)
1. CRDT (Conflict-free Replicated Data Types)
중앙 서버 승인 없이 여러 에이전트가 동시에 데이터를 수정하고, 나중에 합쳐도(Merge) 항상 동일한 결과가 보장되는 데이터 구조.
- 동작: 파일 전체를 쓰는 대신 변경 사항(Delta)만 주고받음
- 장점: 잠금 불필요, 네트워크 지연·순서 뒤바뀜에도 결과 안전
- 한계: 별도 동기화 서버(WebSocket 등) 필요
| 라이브러리 | 특성 | 언어 | 비고 |
|---|---|---|---|
| Yjs | 텍스트·JSON·리스트 지원, 가장 널리 사용 | JavaScript/TypeScript | WebSocket 기반 동기화 |
| Automerge | JSON 구조 동시 편집 최적화 | JavaScript/Rust | 복잡한 설정값·데이터에 유리 |
| Loro | 차세대 CRDT, Rust 기반 고성능 | Rust (바인딩: JS/Python) | 2025~2026 주목, AI 에이전트 동기화 타겟 |
2. Redis Pub/Sub (메모리 기반 협업)
파일이 아닌 데이터 단위로 협업. 에이전트끼리 실시간으로 편집 이벤트를 주고받는 메모리 기반 공간.
- 동작: 에이전트가 변경 이벤트를 Redis에 publish → 상대가 subscribe로 수신
- 장점: 구현 빠름, 23서버에 Redis 설치 가능
- 한계: 파일 편집이 아니라 메시지 기반이라 MD 직접 편집과 거리 있음
3. E2B / Agent Sandbox
에이전트 전용 격리 클라우드 환경. 여러 에이전트가 하나의 샌드박스에 접속하여 파일 수정·결과 공유.
- 장점: 인프라 관리 최소
- 한계: 외부 SaaS 의존, 자체 서버 운영 철학과 충돌 가능
4. 현재 인프라 대비 실현성
| 기술 | 23·24서버 적용 가능성 | 추가 필요 인프라 | 비고 |
|---|---|---|---|
| Yjs | 중간 — WebSocket 서버 필요 | Node.js 서비스 1개 | 가장 완성도 높음 |
| Redis Pub/Sub | 높음 — 23서버에 Redis 설치 가능 | Redis 인스턴스 | 이벤트 기반, 파일 편집과 갭 있음 |
| Loro | 낮음 — Rust 빌드 + 바인딩 필요 | Rust 환경 | 미래 대비용 |
| E2B | 낮음 — SaaS 의존 | 외부 서비스 | 자체 인프라 철학과 충돌 |
| NAS + 규칙 (현재) | 이미 동작 | 없음 | 충돌 회피지 동시성 제어 아님 |
5. 추천 구현 전략 (단계별)
| 단계 | 방식 | 설명 |
|---|---|---|
| 0단계 (현재) | NAS + 파일명/섹션 분리 | 충돌 회피. 즉시 사용 가능 |
| 1단계 | Redis 이벤트 알림 | 편집 시작/완료를 Redis로 알림. 파일은 여전히 NAS |
| 2단계 | Yjs + WebSocket | MD 문서의 실시간 공동 편집. Google Docs 수준 |
| 3단계 | CRDT + NAS 스냅샷 | 편집 중 상태는 CRDT 메모리, 완료 시 NAS에 스냅샷 저장 |
Unresolved
- 에이전트(Claude Code, Codex, Cursor)가 Yjs WebSocket 클라이언트로 직접 연결 가능한지
- MD 파일 편집에 CRDT가 과도한 오버엔지니어링인지 (파일 규모가 작으면 Redis 알림 + 잠금으로 충분할 수 있음)
- 23서버 Node.js 환경 존재 여부 (Yjs 서버 실행용)