heimdallr 는 LINE+ 채팅 서비스 아키텍처에서 영감을 받아 Akka의 액터 모델을 기반으로 Scala 언어로 작성된 대규모 채팅 애플리케이션 서버입니다. 개념 증명에서 엔터프라이즈 지원 솔루션으로의 확장을 지원하기 위해 Redis Pubsub를 기반으로 내결함성과 안정적인 확장 옵션을 제공합니다. 대규모 시스템의 경우 Socket.io보다 최소 100배 빠른 것으로 테스트되었습니다. heimdallr 는 현재 실제 생산을 기반으로 하며 대규모 동시 연결을 지원합니다. 이 프로젝트는 Apache License v2.0에 따라 라이센스가 부여됩니다.
heimdallr 의 아키텍처는 Akka HTTP 서버, Streams 및 ChatRoomActor, UserActor, AggregationActor로 구성됩니다. 각 ChatRoom은 여러 서버에 분산될 수 있습니다. 서버 간에 메시지를 동기화하기 위해 Redis PubSub를 사용합니다. UserActor는 모든 웹소켓 클라이언트마다 생성됩니다.
TODO: 아직 구현되지 않았습니다.
아래 HTTP 서버 테스트는 단일 m4.large 인스턴스에서 6개의 스레드와 10000개의 연결이 포함된 wrk 벤치마킹 도구를 사용하여 수행되었습니다.
Node.js | heimdallr | |
---|---|---|
초당 요청 | 14533.90 | 20675.89 |
평균 숨어 있음 | 68.94ms | 13.35ms |
요약 | 1.00m 단위로 요청 873389개, 읽기 108.36MB 소켓 오류: 연결 8981, 읽기 0, 쓰기 0, 시간 초과 0 요청/초: 14533.90 전송/초: 1.80MB | 1.00m 단위로 요청 1242244개, 읽기 181.26MB 소켓 오류: 연결 8981, 읽기 0, 쓰기 0, 시간 초과 0 요청/초: 20675.89 전송/초: 3.02MB |
이 표는 이벤트 브로드캐스팅 성능, 메시지가 웹소켓 클라이언트에 도착하는 평균 대기 시간을 보여줍니다. 이 테스트는 HTTP 서버 테스트와 동일한 m4.large 인스턴스에서 수행되었습니다.
Socket.io (단일 노드) | heimdallr (단일 노드) | heimdallr 클러스터 (노드 2개) | heimdallr 클러스터 (노드 4개) | |
---|---|---|---|---|
서브 10개, 펍 1개 | 43ms | 43ms | 16ms | 20ms |
구독자 100명, 펍 5개 | 62ms | 61ms | 53ms | 32ms |
구독자 1000명, 술집 10개 | 496ms | 390ms | 129ms | 47ms |
구독자 1000명, 술집 50명 | 1304ms | 554ms | 141ms | 109ms |
구독자 1000명, 술집 100명 | 2242ms | 605ms | 202ms | 114ms |
저장소를 복제하고 sbt로 빌드해 보세요.
% sbt run
웹소켓 로드 밸런서를 설정하려면 프록시 모듈과 함께 HAProxy 또는 Apache2 HTTPD를 사용할 수 있습니다. 대규모 동시성을 지원해야 하는 경우 AWS ALB 또는 HAProxy를 권장합니다. Apache2를 사용하려면 다음 명령을 사용하여 모듈을 활성화하십시오. sudo a2enmod rewrite proxy proxy_http proxy_wstunnel proxy_balancer lbmethod_byrequests
그리고 아래와 같이 가상 호스트 파일을 편집합니다.
<VirtualHost *:80>
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule proxy_module>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/
RewriteRule ^(.*)$ /$1 [P]
ProxyRequests Off
ProxyPass "/" balancer://mycluster/
<Proxy "balancer://mycluster">
BalancerMember ws://{ heimdallr _SERVER_ADDRESS_1}:8080
BalancerMember ws://{ heimdallr _SERVER_ADDRESS_2}:8080
</Proxy>
</IfModule>
</VirtualHost>
Redis PubSub를 활성화하려면 application.conf 파일을 열고 아래와 같이 Redis IP 주소와 포트를 편집합니다.
redis-ip = "{REDIS_IP_ADDRESS}"
및 redis-port = 6379
이 예에서는 Java-WebSocket 라이브러리가 사용되었습니다.
public class WSClientSample extends WebSocketClient {
public WSClientSample ( URI serverURI ) {
super ( serverURI );
}
...
public static void main ( String [] args ) throws Exception {
String uri = ( "ws://APACHE_WEBSERVERR/{CHATROOMID}" );
WSClientSample c = new WSClientSample ( new URI ( uri ));
c . connect ();
}
}
우리 프로젝트의 데모를 보려면 heimdallr /src/main/web
에서 미리 만들어진 websocket 연결 html 파일을 사용할 수 있습니다.
기본적으로 Scala 스타일 가이드를 따르세요.