[messaging] Centrifugo
Updated:
개요
- 사이트
- 오픈소스 실시간 메시징 서버
- Centrifuge(Go) 라이브러리를 기반으로 구축
- 다양한 실시간 전송(WebSocket, HTTP-streaming, SSE/EventSource, WebTransport, GRPC)을 통해 연결된 애플리케이션 온라인 사용자에게 메시지를 즉시 전달
- 언어에 구애받지 않으며 모든 백엔드 및 프런트엔드와 결합하여 채팅 앱, 실시간 댓글, 멀티플레이어 게임, 실시간 데이터 시각화, 협업 도구, AI 스트리밍 응답 등을 구축하는 데 사용
- 시간 전송 계층에서 비즈니스 로직 분리 가능
- 수평적으로 확장되어 클라이언트 연결의 부하를 분산 가능
- 수백만 개의 동시 채널을 처리할 수 있는 고성능 PUB/SUB 브로커 세트와의 통합을 통해 달성
- 브라우저 및 모바일 개발을 위한 여러 공식 SDK 제공
- 양방향 클라이언트-서버 프로토콜을 래핑하여 단일 연결을 통해 다중화된 실시간 구독을 위한 간단한 API를 제공
- 재연결을 처리하고, 핑퐁, 시간 초과를 관리하고, 실시간 연결 작업의 다른 복잡성을 처리
- SDK 종속성 없이 간단한 사용 사례에 대한 단방향 접근 방식을 지원
- 다양한 전송을 통한 연결을 처리하고 간단한 게시 API를 제공하는 셀프호스팅 서비스
- 다양한 유형의 실시간 애플리케이션을 빌드하는 데 사용
- Slack 규모의 메신저
- 클라이언트 연결로 60Hz 데이터를 스트리밍하여 시스템 상태에 대한 즉각적인 시각적 피드백을 제공
배경
- 10년 이상 전에 내장된 동시성 지원이 부족한 언어나 프레임워크로 작성된 서버 측 코드가 있는 애플리케이션을 돕기 위해 탄생
- 지속적인 연결을 관리하는 것은 실제로 골치 아픈 일
- 일반적으로 기술 스택을 변경하고 프로덕션에 적합한 솔루션을 개발하는 데 시간을 투자해야만 해결 가능
- Django, Flask, Yii, Laravel, Ruby on Rails 등의 프레임워크는 실시간 메시징 작업을 위한 수많은 지속적인 연결을 처리하는 데 제한적이거나 최적이 아닌 지원을 제공
- 애플리케이션 백엔드 아키텍처를 근본적으로 변경하지 않고도 실시간 업데이트를 도입하고 많은 지속적인 연결을 관리하는 간단하고 눈에 띄지 않는 방법을 제공
- 개발자는 선호하는 언어나 프레임워크를 사용하여 애플리케이션의 백엔드에서 계속 작업하고 기존 아키텍처 유지 가능
- 백엔드가 비동기 동시 언어나 프레임워크로 구축된 경우에도 개발 시간을 절약할 수 있는 고급스럽고 고유한 기능을 제공
- 애플리케이션의 기술 스택에 관계없이 범용 실시간 구성 요소로 사용 가능
- 백엔드와 실시간 연결 관리를 더욱 심층적으로 통합 가능
특징
- 원활한 통합
- 아키텍처나 동시성 모델에 관계없이 기존 백엔드와 손쉽게 통합
- 모놀리식 및 마이크로서비스 아키텍처를 모두 원활하게 지원
- 실시간 업데이트를 도입하기 위해 기존 앱 아키텍처를 변경할 필요가 없음
- 뛰어난 성능
- Go 언어로 작성
- 대규모 실시간 통신을 처리하기 위한 스마트 최적화를 통합
- 내장된 확장성
- PUB/SUB 브로커를 사용하여 여러 머신에서 잘 확장되도록 설계
- PUB/SUB 엔진인 Redis가 확장성의 핵심
- Redis는 클라이언트 측 일관된 샤딩과 Redis 클러스터를 지원하여 무거운 부하에서도 단일 Redis 인스턴스가 병목 현상이 되지 않도록 보장
- Redis 호환 데이터베이스와 Nats도 지원하여 유연성을 제공
- 다양한 실시간 전송
- 양방향
- WebSocket, HTTP 스트리밍 및 SSE(Server-Sent Events) 제공
- WebTransport는 실험적 형태로 지원
- 단방향
- SSE(EventSource), HTTP 스트리밍, GRPC 단방향 스트림을 사용하여 실시간 업데이트를 위한 단방향 접근 방식도 지원
- 양방향
- 엄격한 클라이언트 프로토콜
- 클라이언트-서버 통신을 위해 JSON 및 바이너리 Protobuf 프로토콜을 지원
- 양방향 프로토콜은 엄격한 스키마에 의해 정의
- 유연한 인증
- JWT를 확인하거나 클라이언트 연결 시 백엔드에 HTTP/GRPC 요청을 발행하여 연결을 인증
- 요청 헤더나 요청 메타데이터(GRPC 연결의 경우) 프록시 가능
- JWT 비밀 키 순환 문제를 해결하는 JWK 사양을 지원
- 연결 관리
- 클라이언트 측 새로 고침 워크플로 또는 백엔드로의 서버 측 호출을 사용하여 연결 새로 고침을 처리하는 방법을 선택 가능
- 사용자 연결을 끊고, 채널에서 사용자를 구독 취소하고, 활성 채널을 검사하는 API를 제공
- 클라이언트 측에서 SDK는 백오프 전략을 사용
- 자동으로 재연결을 처리
- 개별 구독 요청이 일시적으로 실패해도 전체 연결이 중단되지 않도록 백오프를 사용하여 재구독도 처리
- 채널(방) 개념
- Centrifugo는 PUB/SUB 서버
- 사용자는 채널 을 구독하여 실시간 업데이트를 받음
- 채널에 전송된 메시지는 모든 온라인 채널 구독자에게 전달
- 채널 구독은 개별 JWT를 포함하여 다양한 방법으로 승인될 수 있으며, 구성 규칙에 따라 승인될 수도 있음
- 다양한 유형의 구독
- 클라이언트 측(클라이언트가 시작)과 서버 측 (서버가 강제로 실행) 채널 구독을 지원
- 채널의 메시지 기록
- 채널의 게시물에 대한 기록을 켤 수 있음
- 채널 기록을 통해 대량 재연결 시나리오에서 살아남는 데 도움
- 클라이언트는 빠른 캐시에서 누락된 상태를 자동으로 따라잡을 수 있으므로 기본 데이터베이스의 부하 감소
- 클라이언트 또는 백엔드 측에서 기록 스트림을 수동으로 반복 가능
- 델타 압축
- 비슷한 메시지를 게시할 경우 대역폭 비용을 크게 줄이는 데 도움
- 양방향 연결을 통한 RPC
- 클라이언트 측에서 백엔드의 구성된 엔드포인트로 RPC 호출을 보내 양방향 연결을 완전히 활용 가능
- WebSocket을 통해 RPC를 호출하면 각 요청에서 헤더를 보내지 않으므로 들어오는 트래픽이 줄어듬
- 온라인 상태 정보
- 활성 채널 구독자에 대한 정보를 제공
- 채널 가입 및 탈퇴 이벤트(누군가가 구독/구독 취소할 때)를 클라이언트 측에서 수신 가능
- 내장된 관리자 웹 UI
- 내장된 관리자 UI를 사용하면 채널에 메시지를 게시하고 Centrifugo 클러스터 정보를 확인하는 등의 작업을 수행 가능
- 크로스 플랫폼
- Linux, macOS, Windows에서 작동
- 배포 준비 완료
- 다양한 배포 방법을 지원
- Docker에서 준비된 RPM 또는 DEB 패키지를 사용 가능
- Kubernetes Helm 차트를 통해 사용 가능
- Let’s Encrypt TLS를 사용하여 자동 TLS를 지원
- Prometheus/Graphite 메트릭을 출력
- Prometheus 데이터 소스에 대한 공식 Grafana 대시보드 존재
- 오픈소스
- Centrifugo는 오픈소스 라이브러리 Centrifuge (MIT 라이선스) 위에 존재
- Centrifugo의 OSS 버전은 관대한 오픈소스 라이선스(Apache 2.0)를 기반
- 모든 공식 클라이언트 SDK와 API 라이브러리는 MIT 라이선스
- PRO 기능
- Centrifugo를 여러 가지 고유한 기능으로 확장하여 비즈니스 채택자에게 흥미로운 이점을 제공
- 푸시 알림 API
- FCM, APNs, HMS를 통해 모바일 및 브라우저 푸시 전송
- ClickHouse를 통한 실시간 분석
- 실시간 생태계에 대한 더 많은 통찰력 제공
- 성능, 압축, 확장성 최적화
- 리소스 사용량을 줄이고 전체 비용을 절감
- 푸시 알림 API
- Centrifugo를 여러 가지 고유한 기능으로 확장하여 비즈니스 채택자에게 흥미로운 이점을 제공