Show HN: 에지 애플리케이션을 위한 확장 가능한 pub/sub 메시징 서버
요약
Narwhal은 에지 애플리케이션을 위한 확장 가능한 메시징 브로커(Message Broker)입니다. 기존의 XMPP나 MQTT 같은 옵션들이 가진 복잡성이나 경직성을 극복하며, 가벼운 성능과 강력한 커스터마이징 기능을 결합했습니다. Narwhal은 'Modulator'라는 외부 서비스를 통해 인증, 인가, 콘텐츠 검증 등 애플리케이션 특화 로직을 위임받아 처리합니다. 이를 통해 핵심 메시지 서버는 경량성을 유지하면서도 복잡한 비즈니스 요구사항을 충족할 수 있습니다. 이 아키텍처는 모바일, IoT 환경 등 에지 디바이스에 최적화되어 있으며, Rust와 io_uring을 활용하여 높은 성능과 보안 기능을 제공합니다.
핵심 포인트
- Narwhal은 기존 메시징 시스템(XMPP, MQTT)의 복잡성/경직성을 해결한 차세대 메시지 브로커입니다.
- 핵심 서버는 가볍게 유지하고, 인증, 인가, 검증 등 애플리케이션 로직을 'Modulator'라는 외부 모듈레이터에 위임합니다.
- Modulator를 통해 JWT 검증, 복잡한 권한 규칙 적용, 메시지 변환 등 다양한 비즈니스 로직 구현이 가능합니다.
- Rust와 io_uring 기반의 비동기 아키텍처로 높은 처리량과 에지 환경에서의 안정성을 보장합니다.
- 클라이언트-서버(C2S), 서버-모듈레이터(S2M), 모듈레이터-서버(M2S) 세 가지 연결 유형을 지원하여 유연한 통신 구조를 제공합니다.
Narwhal: 에지 애플리케이션을 위한 확장 가능한 메시지 브로커 (Message Broker)
Narwhal은 특정한 좌절감에서 탄생했습니다: 현대적인 채팅 기능을 구축하는 것이 이렇게 어려워서는 안 된다는 점입니다.
스타트업 프로젝트에 실시간 채팅을 통합하려고 할 때, 기존의 옵션들은 어려운 트레이드오프 (Trade-off)를 강요했습니다:
XMPP (예: ejabberd): 강력하지만, 엄청난 복잡성, XML 오버헤드, 그리고 단순한 요구사항에 비해 가파른 학습 곡선(Learning Curve)을 가집니다.
MQTT 브로커 (Brokers): 가볍고 빠르지만, 경직되어 있습니다. 커스텀 인증(Authentication), 동적 권한(Dynamic Permissions), 또는 메시지 검증(Message Validation)을 구현하려면 종종 C/C++로 복잡한 브로커 플러그인을 작성하거나, 브로커를 "사이드카 (Sidecar)" 형태의 복잡한 구조로 감싸야 합니다.
Narwhal은 그 중간 지점에 있습니다. Narwhal은 에지 브로커 (Edge Broker)의 가벼운 성능을 제공하면서도, "두뇌" 역할(인증 (Authentication), 인가 (Authorization), 검증 (Validation))을 Modulator를 통해 애플리케이션 코드로 위임합니다.
Modulator는 Narwhal의 메시징 레이어 (Messaging Layer) 상에서 커스텀 애플리케이션 로직을 구현하는 외부 서비스입니다. 서버에 애플리케이션 특화 기능을 내장하는 대신, Narwhal은 이러한 관심사들을 Modulator에 위임함으로써 핵심 서버를 가볍게 유지하고 메시지 라우팅 (Message Routing)에 집중할 수 있게 합니다.
각 Narwhal 서버는 정확히 하나의 Modulator에 연결되어, 일관된 애플리케이션 프로토콜 세맨틱스 (Protocol Semantics)를 보장합니다.
일반적인 Modulator 사용 사례:
커스텀 인증 (Custom Authentication): JWT 검증, OAuth 흐름, 또는 독자적인 인증 체계
인가 및 액세스 제어 (Authorization & Access Control): 기본적인 채널 ACL을 넘어서는 복잡한 권한 규칙
콘텐츠 검증 (Content Validation): 메시지 스키마 (Schemas), 크기 제한, 또는 콘텐츠 정책
메시지 변환 (Message Transformation): 암호화, 압축, 또는 메시지 강화 (Enrichment)
비즈니스 로직 (Business Logic): 게임 로직, 채팅 중재 (Moderation), 프레즌스 (Presence) 시스템
통합 (Integration): 외부 서비스, 데이터베이스, 또는 API와의 브릿지 (Bridge)
demo.mp4
에지 애플리케이션을 위한 설계 (Designed for Edge Applications): 모바일, 데스크톱 또는 IoT 환경을 위해 특별히 구축됨
모듈형 아키텍처 (Modular Architecture): 외부 모듈레이터 (Modulator)를 통해 커스텀 애플리케이션 로직으로 서버를 확장 가능
기본 보안 설정 (Secure by Default): 개발을 위한 자동 인증서 생성을 포함한 TLS/SSL 지원
채널 관리 (Channel Management): 채널별 세밀한 액세스 제어 (Access Control) 및 설정
고성능 (High Performance): 높은 처리량 (Throughput)을 위해 io_uring을 활용한 비동기 Rust 구현 (벤치마크 결과 참조)
- Rust 1.90 이상
- OpenSSL
git clone https://github.com/ortuman/narwhal.git
cd narwhal
cargo build --release
컴파일된 바이너리는 target/release/narwhal에서 확인할 수 있습니다.
# 기본 설정으로 실행
cargo run --bin narwhal
# 또는 커스텀 설정 파일과 함께 실행
...
서버가 실행되면 OpenSSL을 사용하여 연결을 테스트할 수 있습니다:
openssl s_client -connect 127.0.0.1:22622 -ign_eof
Narwhal은 세 가지 연결 유형을 지원합니다:
클라이언트-대-서버 (Client-to-Server, C2S): Narwhal 서버에 연결하는 최종 사용자 클라이언트
서버-대-모듈레이터 (Server-to-Modulator, S2M): 작업을 위임하기 위해 서버가 모듈레이터에 시작하는 연결
모듈레이터-대-서버 (Modulator-to-Server, M2S): 클라이언트에 프라이빗 메시지를 보내기 위해 모듈레이터가 시작하는 연결
graph LR
Clients["Clients"] <-->|C2S| Server["Narwhal Server"]
Server <-->|S2M/M2S| Modulator["Modulator"]
Narwhal은 설정을 위해 TOML 형식을 사용합니다. 예시는 examples/config/ 디렉토리를 참조하세요.
프로토콜 사양 (Protocol Specification): 메시지 형식, 흐름 예시 및 와이어 포맷 (Wire Format) 세부 사항을 포함한 완전한 프로토콜 문서
벤치마크 결과 (Benchmark Results): 다양한 페이로드 (Payload) 크기에 따른 성능 벤치마크 및 처리량 분석
행동 강령 (Code of Conduct): 커뮤니티 가이드라인
기여 가이드 (Contributing Guide): 프로젝트에 기여하는 방법
저장소에는 examples/modulator/ 디렉토리에 여러 예시 모듈레이터가 포함되어 있습니다:
plain-authenticator: 간단한 사용자 이름/비밀번호 인증 (authentication)
broadcast-payload-json-validator: JSON 메시지 페이로드 (payload) 검증
broadcast-payload-csv-validator: CSV 메시지 페이로드 (payload) 검증
private-payload-sender: 클라이언트에 대한 프라이빗 메시지 (private messages) 전송 시연
각 예제는 Narwhal을 위한 모듈레이터 (modulator)를 구축하는 다양한 측면을 보여줍니다.
narwhal/
├── crates/
│ ├── benchmark/ # 성능 벤치마킹 (benchmarking) 도구
...
cargo test
Narwhal에는 처리량 (throughput)과 지연 시간 (latency) 성능을 측정하기 위한 벤치마크 (benchmark) 도구가 포함되어 있습니다:
# 벤치마크 도구 빌드
cargo build --bin narwhal-bench --release
# 로컬 서버를 대상으로 기본 벤치마크 실행
...
벤치마크 도구는 Narwhal 서버에 연결하여 메시지를 교환하는 여러 프로듀서 (producer) 및 컨슈머 (consumer) 클라이언트를 시뮬레이션합니다. 다음과 같은 지표 (metrics)를 보고합니다:
- 메시지 처리량 (messages/second)
- 지연 시간 백분위수 (latency percentiles) (p50, p90, p99)
- 연결 성공률 (connection success rates)
- 총 전송 및 수신 메시지 수
지속성 (Persistence)을 위해서는 서버 측에서 인증된 클라이언트가 필요하므로, 벤치마크는 인증 모듈레이터 (auth modulator)가 부착된 서버와 통신해야 합니다. 저장소의 plain-authenticator 예제가 가장 간단한 방법입니다. 세 가지 요소를 별도의 터미널에서 실행하세요:
# 1. 모듈레이터 빌드 및 실행 (인증 전용, 유닉스 소켓 (unix socket)에서 대기).
cargo build --release --manifest-path examples/modulator/Cargo.toml -p plain-authenticator
examples/modulator/target/release/plain-authenticator \
...
# 2. 모듈레이터로 다이얼링하는 벤치마크 최적화 설정 (bench-tuned config)으로 서버 실행.
target/release/narwhal --config examples/config/c2s-benchmark-with-s2m-unix.toml
# 3. 벤치마크 실행. --persist는 채널별 메시지 지속성 (per-channel message persistence)을 활성화하며,
# --auth-password는 각 클라이언트를 모듈레이터에 대한 PLAIN 인증을 통해 라우팅합니다.
./target/release/narwhal-bench \
...
이 모드에서는 모든 브로드캐스트(broadcast)가 채널의 추가 전용(append-only) 메시지 로그에 기록되며, 로그가 플러시(flush)된 후에만 확인(acknowledge)됩니다. 따라서 정상 상태(steady-state)의 처리량(throughput)은 네트워크/디스패치(dispatch) 경로보다는 단일 플러시 지연 시간(single-flush latency)에 의해 제한됩니다.
메시지별 엄격한 내구성(durability)을 희생하여 더 높은 처리량을 얻으려면 --flush-interval-ms <N>을 추가하십시오.
벤치마크는 SET_CHAN_CONFIG를 통해 채널의 message_flush_interval을 설정하며, 이를 통해 서버는 추가(append)당 인라인 플러시(inline flush) 방식에서 N ms마다 수행되는 백그라운드 플러시(background flush) 방식으로 전환됩니다:
./target/release/narwhal-bench \
--server 127.0.0.1:22622 \
--producers 1 \
...
현재 버전: 0.7.0 (Alpha)
Narwhal은 활발히 개발 중이며 현재 알파(alpha) 단계에 있습니다. 핵심 기능은 작동하고 테스트되었으나, 다음 사항에 유의하십시오:
API가 변경될 수 있음 - 1.0.0 버전에 도달하기 전에 API가 변경될 수 있습니다. 커뮤니티 피드백을 바탕으로 프로토콜과 인터페이스를 개선함에 따라 중대한 변경 사항(Breaking changes)이 발생할 수 있습니다.
평가 및 개발 용도 - 테스트, 개념 증명(proof-of-concepts) 및 비운영(non-production) 환경에 적합합니다.
커뮤니티 피드백 환영 - 1.0.0 API를 안정화하기 전에 Narwhal을 개선하기 위한 입력을 적극적으로 구하고 있습니다.
Narwhal을 운영 환경(production)에서 사용하는 것에 관심이 있다면, 프로젝트에 참여하고 피드백을 제공하여 프로젝트의 미래를 함께 만들어 가시길 권장합니다!
저희는 Narwhal의 기능을 확장하기 위해 적극적으로 노력하고 있습니다. 향후 릴리스를 위해 계획된 기능은 다음과 같습니다:
메시지 지속성 (Message Persistence): 신뢰할 수 있는 메시지 전달을 위한 내구성 있는 메시지 저장
강화된 관찰 가능성 (Enhanced Observability): 내장된 메트릭(metrics), 트레이싱(tracing) 및 모니터링 기능
성능 최적화 (Performance Optimizations): 처리량(throughput) 및 지연 시간(latency)의 지속적인 개선
추가 프로토콜 전송 (Additional Protocol Transports): WebSocket 및 기타 전송 계층(transport layers) 지원
연합 지원 (Federation Support): 여러 Narwhal 서버가 분산된 배포 환경 전반에서 통신하고 메시지를 공유할 수 있도록 하여, 수평적 확장(horizontal scaling) 및 멀티 리전(multi-region) 아키텍처를 가능하게 함
기여를 환영합니다! 다음 사항에 대한 자세한 내용은 기여 가이드(Contributing Guide)를 참조하십시오:
- 버그 보고 (Reporting bugs)
- 기능 제안 (Suggesting features)
- 풀 리퀘스트 제출 (Submitting pull requests)
- 개발 환경 설정 (Development setup)
이 프로젝트는 BSD-3-Clause License 하에 라이선스가 부여됩니다 - 자세한 내용은 LICENSE 파일을 참조하십시오.
Issues: GitHub Issues
Discussions: GitHub Discussions
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Show HN (AI)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기