2.2 KiB
2.2 KiB
결정 사항: 대시보드-봇 통신 아키텍처 (gRPC Proxy)
배경 (Context)
대시보드(Next.js)와 멀티 인스턴스 샤딩 환경의 봇 간에 실시간 통신이 필요합니다. 대시보드는 특정 길드의 설정을 변경하거나 채널 목록을 조회해야 하지만, 봇이 여러 프로세스(Shard)로 쪼개져 있어 어떤 인스턴스가 해당 길드를 관리하는지 대시보드가 알기 어려운 문제가 있습니다.
결정된 사항 (Decision)
-
통신 프로토콜: gRPC (HTTP/2) 선택
- 강력한 타입 시스템(
packages/grpc-contracts) 공유를 위해 선택했습니다. - 대량의 데이터 전송 및 실시간 양방향 통신 확장에 유리합니다.
- 강력한 타입 시스템(
-
Manager as API Proxy 패턴 채택
- 구조: Dashboard <-> ShardingManager (gRPC Server) <-> Shards (IPC)
- 모든 대시보드 요청은 단 하나의 포트(
50051)를 가진ShardingManager로 집중됩니다. - 매니저는
guildId등의 키를 확인하여 내부적으로broadcastEval또는IPC를 통해 해당 Shard에게 업무를 하달합니다.
-
데이터 보관 전략: DB (Prisma) 중심
- 실시간성이 극도로 중요한 요청 외의 설정값 변경은 DB를 우선 업데이트하고, 봇이 이를 캐시 동기화하도록 인터페이스를 구성합니다.
장점 (Pros)
- 인프라 간소화: 봇 인스턴스가 100개로 늘어나도 대시보드 입장에서는
50051포트 하나만 바라보면 됩니다. - 포트 충돌 방지: 각 샤드 워커마다 별도의 서버 포트를 할당할 필요가 없습니다.
- 코드 공유: 모노레포 구조를 통해 클라이언트와 서버가 동일한
.proto계약을 공유합니다.
단점 (Cons)
- 매니저 오버헤드: 매니저가 모든 통신을 중계하므로, 통신량이 극도로 많아질 경우 매니저가 병목이 될 수 있습니다. (이 경우 추후 Redis Pub/Sub으로 전환 고려)
대안 (Alternatives)
- Redis Pub/Sub: 가장 유연하지만 추가 인프라(Redis) 관리가 필요합니다. 현재는 단일 서버 환경이므로 gRPC Proxy가 더 효율적이라고 판단했습니다.