heimdallr هو خادم تطبيقات دردشة واسع النطاق مستوحى من بنية خدمة الدردشة LINE+ ومكتوب بلغة Scala استنادًا إلى نموذج ممثل Akka. وهو يوفر خيارات توسيع موثوقة ومتسامحة مع الأخطاء، استنادًا إلى Redis Pubsub لدعم التوسع من إثبات المفهوم إلى الحلول الجاهزة للمؤسسات. لقد تم اختباره ليكون أسرع 100 مرة على الأقل من مقبس io للأنظمة واسعة النطاق. يتم تشغيل heimdallr حاليًا من خلال الإنتاج الواقعي ودعم الاتصالات المتزامنة الثقيلة. تم ترخيص هذا المشروع بموجب ترخيص Apache v2.0.
تتكون بنية heimdallr من Akka HTTP Server، Streams وChatRoomActor، UserActor، AggregationActor. يمكن توزيع كل غرفة دردشة عبر خوادم متعددة. لمزامنة الرسائل بين الخوادم، نستخدم Redis PubSub. يتم إنشاء UserActor لكل عميل websocket.
TODO: لم يتم تنفيذه بعد.
تم إجراء اختبار خادم HTTP أدناه باستخدام أداة قياس أداء WRK مع 6 سلاسل رسائل و10000 اتصال على مثيل m4.large واحد.
Node.js | heimdallr | |
---|---|---|
الطلبات في الثانية | 14533.90 | 20675.89 |
متوسط كمون | 68.94 مللي ثانية | 13.35 مللي ثانية |
ملخص | 873389 طلبًا في 1.00 م، وقراءة 108.36 ميجابايت أخطاء المقبس: الاتصال 8981، القراءة 0، الكتابة 0، المهلة 0 الطلبات/الثانية: 14533.90 النقل/الثانية: 1.80 ميجابايت | 1242244 طلبًا في 1.00 م، وقراءة 181.26 ميجابايت أخطاء المقبس: الاتصال 8981، القراءة 0، الكتابة 0، المهلة 0 الطلبات/الثانية: 20675.89 النقل/الثانية: 3.02 ميجابايت |
يوضح هذا الجدول أداء بث الأحداث، ومتوسط زمن الوصول للرسالة للوصول إلى عميل websocket. تم إجراء هذا الاختبار على نفس مثيل m4.large مثل اختبار خادم HTTP.
المقبس.io (عقدة واحدة) | heimdallr (عقدة واحدة) | مجموعة heimdallr (عقدتان) | مجموعة heimdallr (4 عقد) | |
---|---|---|---|---|
10 فرعية، 1 حانة | 43 مللي ثانية | 43 مللي ثانية | 16 مللي ثانية | 20 مللي ثانية |
100 فرعي، 5 حانة | 62 مللي ثانية | 61 مللي ثانية | 53 مللي ثانية | 32 مللي ثانية |
1000 فرعي، 10 حانة | 496 مللي ثانية | 390 مللي ثانية | 129 مللي ثانية | 47 مللي ثانية |
1000 فرعي، 50 حانة | 1304 مللي ثانية | 554 مللي ثانية | 141 مللي ثانية | 109 مللي ثانية |
1000 فرعي، 100 حانة | 2242 مللي ثانية | 605 مللي ثانية | 202 مللي ثانية | 114 مللي ثانية |
انسخ المستودع وحاول البناء باستخدام sbt:
% sbt run
لإعداد موازن تحميل websocket، يمكنك استخدام 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 ();
}
}
لرؤية العرض التوضيحي لمشروعنا، يمكنك استخدام ملف html المتصل بـ websocket الجاهز في heimdallr /src/main/web
.
اتبع بشكل أساسي دليل أسلوب Scala.