heimdallr adalah server aplikasi obrolan berskala besar yang terinspirasi oleh arsitektur layanan obrolan LINE+ dan ditulis dalam bahasa Scala berdasarkan model aktor Akka. Ini memberikan opsi penskalaan yang andal dan toleran terhadap kesalahan, berdasarkan Redis Pubsub untuk mendukung perluasan dari bukti konsep ke solusi yang siap digunakan perusahaan. Ini telah diuji setidaknya 100x lebih cepat dari socket.io untuk sistem skala besar. heimdallr saat ini didukung oleh produksi dunia nyata dan mendukung koneksi simultan yang berat. Proyek ini dilisensikan di bawah Lisensi Apache v2.0.
Arsitektur heimdallr terdiri dari Server HTTP Akka, Streams dan ChatRoomActor, UserActor, AggregationActor. Setiap ChatRoom dapat didistribusikan ke beberapa server. Untuk menyinkronkan pesan antar server, kami menggunakan Redis PubSub. UserActor dibuat untuk setiap klien websocket.
TODO: belum diterapkan.
Pengujian server HTTP di bawah ini dilakukan menggunakan alat pembandingan wrk dengan 6 thread dan 10.000 koneksi pada satu instance m4.large.
Node.js | heimdallr | |
---|---|---|
Permintaan per detik | 14533.90 | 20675.89 |
Rata-rata Latensi | 68,94 mdtk | 13,35 mdtk |
Ringkasan | 873389 permintaan dalam 1,00m, 108,36MB dibaca Kesalahan soket: sambungkan 8981, baca 0, tulis 0, batas waktu 0 Permintaan/detik: 14533.90 Transfer/dtk: 1,80MB | 1242244 permintaan dalam 1,00m, 181,26MB dibaca Kesalahan soket: sambungkan 8981, baca 0, tulis 0, batas waktu 0 Permintaan/dtk: 20675.89 Transfer/dtk: 3,02 MB |
Tabel ini menunjukkan kinerja penyiaran acara, latensi rata-rata pesan sampai di klien websocket. Pengujian ini dilakukan pada instance m4.large yang sama dengan pengujian server HTTP.
soket.io (simpul tunggal) | heimdallr (simpul tunggal) | Gugus heimdallr (2 node) | Gugus heimdallr (4 node) | |
---|---|---|---|---|
10 sub, 1 pub | 43 ms | 43 ms | 16 ms | 20 ms |
100 sub, 5 pub | 62 mdtk | 61 mdtk | 53 ms | 32 ms |
1000 sub, 10 pub | 496 ms | 390 ms | 129 ms | 47 ms |
1000 sub, 50 pub | 1304 ms | 554 ms | 141 ms | 109 ms |
1000 sub, 100 pub | 2242 mdtk | 605 ms | 202 mdtk | 114 ms |
Kloning repositori dan coba buat dengan sbt:
% sbt run
Untuk menyiapkan penyeimbang beban soket web, Anda dapat menggunakan HAProxy atau Apache2 HTTPD dengan modul proksi. Jika Anda perlu mendukung konkurensi berat, AWS ALB atau HAProxy direkomendasikan. Jika Anda ingin menggunakan Apache2, aktifkan modul dengan perintah berikut: sudo a2enmod rewrite proxy proxy_http proxy_wstunnel proxy_balancer lbmethod_byrequests
Dan edit file virtual host seperti di bawah ini:
<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>
Untuk mengaktifkan Redis PubSub, buka file application.conf dan edit alamat IP dan port Redis seperti di bawah ini:
redis-ip = "{REDIS_IP_ADDRESS}"
dan redis-port = 6379
Dalam contoh ini, perpustakaan Java-WebSocket digunakan.
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 ();
}
}
Untuk melihat demo proyek kami, Anda dapat menggunakan file html terhubung websocket kami yang sudah jadi di heimdallr /src/main/web
.
Pada dasarnya ikuti panduan gaya Scala.