heimdallr é um servidor de aplicativos de bate-papo em grande escala inspirado na arquitetura de serviço de bate-papo LINE+ e escrito em linguagem Scala com base no modelo de ator de Akka. Ele fornece opções de expansão confiáveis e tolerantes a falhas, baseadas no Redis Pubsub para dar suporte à expansão de soluções de prova de conceito para soluções prontas para empresas. Ele foi testado para ser pelo menos 100x mais rápido que o socket.io para sistemas de grande escala. heimdallr é atualmente alimentado por produção no mundo real e suporta conexões simultâneas pesadas. Este projeto está licenciado sob a Licença Apache v2.0.
A arquitetura do heimdallr consiste em um servidor HTTP Akka, Streams e ChatRoomActor, UserActor, AggregationActor. Cada ChatRoom pode ser distribuído em vários servidores. Para sincronizar as mensagens entre servidores, usamos Redis PubSub. UserActor é criado para cada cliente websocket.
TODO: ainda não implementado.
O teste do servidor HTTP abaixo foi feito usando a ferramenta de benchmarking wrk com 6 threads e 10.000 conexões em uma única instância m4.large.
Node.js | heimdallr | |
---|---|---|
Solicitações por segundo | 14533,90 | 20675,89 |
Média Latência | 68,94ms | 13,35ms |
Resumo | 873389 solicitações em 1,00 m, 108,36 MB de leitura Erros de soquete: conectar 8981, ler 0, escrever 0, tempo limite 0 Solicitações/s: 14.533,90 Transferência/s: 1,80 MB | 1242244 solicitações em 1,00 m, 181,26 MB lidos Erros de soquete: conectar 8981, ler 0, escrever 0, tempo limite 0 Solicitações/seg: 20.675,89 Transferência/s: 3,02 MB |
Esta tabela mostra o desempenho da transmissão de eventos, a latência média para uma mensagem chegar a um cliente websocket. Este teste foi feito na mesma instância m4.large do teste do servidor HTTP.
Soquete.io (nó único) | heimdallr (nó único) | Aglomerado heimdallr (2 nós) | Aglomerado heimdallr (4 nós) | |
---|---|---|---|---|
10 sub, 1 pub | 43ms | 43ms | 16ms | 20ms |
100 sub, 5 bares | 62ms | 61ms | 53ms | 32ms |
1000 sub, 10 pub | 496ms | 390ms | 129ms | 47ms |
1000 sub, 50 pub | 1304ms | 554ms | 141ms | 109ms |
1000 sub, 100 pub | 2242ms | 605ms | 202ms | 114ms |
Clone o repositório e tente construir com sbt:
% sbt run
Para configurar um balanceador de carga websocket, você pode usar HAProxy ou Apache2 HTTPD com módulos proxy. Se você precisar oferecer suporte a simultaneidade intensa, recomenda-se AWS ALB ou HAProxy. Se você quiser usar o Apache2, habilite os módulos com o seguinte comando: sudo a2enmod rewrite proxy proxy_http proxy_wstunnel proxy_balancer lbmethod_byrequests
E edite o arquivo host virtual como abaixo:
<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>
Para habilitar o Redis PubSub, abra o arquivo application.conf e edite o endereço IP e a porta do Redis como abaixo:
redis-ip = "{REDIS_IP_ADDRESS}"
e redis-port = 6379
Neste exemplo, foi usada a biblioteca 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 ();
}
}
Para ver a demonstração do nosso projeto, você pode usar nosso arquivo html conectado ao websocket pronto em heimdallr /src/main/web
.
Siga basicamente o guia de estilo Scala.